亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Opengl學習程序之uniform

2019-11-11 04:53:00
字體:
來源:轉載
供稿:網友

實現程序:

#include "stdafx.h"#include<iostream>using namespace std;#include "vgl.h"#include "LoadShaders.h"http://uniform//在著色器運行之前,uniform修飾符可以指定一個在應用程序中設置好的變量,它不會在圖元處理的過程中發生變化//uniform變量在所有可用的著色階段之間都是共享的,他必須定義為全局變量。任何類型的變量(包括結構體和數組)//都可以設置為uniform變量,著色器無法寫入到uniform變量,也無法改變他的值。//genType radians(genType degrees):從度數轉換成弧度//genType normalize(genType x):返回與向量方向一致但長度是1的向量//mat3 outerPRoduct(vec3 c,vec3 r):把第一個參數視作列向量(只有一列的矩陣),把第二個參數視作行向量(只有一行的矩陣)//對矩陣c及r進行線性代數相乘c x r,產生一個行數與c的元素數相同,以及列數與r的元素相同的矩陣。const char* vShader = { "#version 330 core/n" "uniform Uniforms{" " vec3 translation;" " float scale;" " vec4 rotation;" " bool enabled;" "};" "layout(location = 0)in vec2 vPos;" "layout(location = 1)in vec3 vColor;" "out vec4 fColor;" "void main()" "{" " vec3 pos = vec3(vPos,0.0);" " float angle = radians(rotation[0]);" " vec3 axis = normalize(rotation.yzw);" " mat3 I = mat3(1.0);" " mat3 S = mat3(0,-axis.z,axis.y, " " axis.z,0,-axis.x," " -axis.y,axis.x,0);" " mat3 uuT = outerProduct(axis,axis);" " mat3 rot = uuT + cos(angle)*(I - uuT) + sin(angle)*S;" " pos *= scale;" " pos *= rot;" " pos += translation;" " fColor = vec4(vColor,1);" " gl_Position = vec4(vPos,0.0,1);" "}"};const char*fShader = { "#version 330 core/n" "uniform Uniforms{" " vec3 translation;" " float scale;" " vec4 rotation;" " bool enabled;" "};" "in vec4 fColor;" "out vec4 color;" "void main()" "{" " color = fColor;" "}"};size_t TypeSize(GLenum type){ size_t size;#define CASE(Enum,Count,Type)/ case Enum:size = Count * sizeof(Type);break switch (type) { CASE(GL_FLOAT, 1, GLfloat); CASE(GL_FLOAT_VEC2, 2, GLfloat); CASE(GL_FLOAT_VEC3, 3, GLfloat); CASE(GL_FLOAT_VEC4, 4, GLfloat); CASE(GL_INT, 1, GLint); CASE(GL_INT_VEC2, 2, GLint); CASE(GL_INT_VEC3, 3, GLint); CASE(GL_INT_VEC4, 4, GLint); CASE(GL_UNSIGNED_INT, 1, GLuint); CASE(GL_UNSIGNED_INT_VEC2, 2, GLuint); CASE(GL_UNSIGNED_INT_VEC3, 3, GLuint); CASE(GL_UNSIGNED_INT_VEC4, 4, GLuint); CASE(GL_BOOL, 1, GLboolean); CASE(GL_BOOL_VEC2, 2, GLboolean); CASE(GL_BOOL_VEC3, 3, GLboolean); CASE(GL_BOOL_VEC4, 4, GLboolean); CASE(GL_FLOAT_MAT2, 4, GLfloat); CASE(GL_FLOAT_MAT2x3, 6, GLfloat); CASE(GL_FLOAT_MAT2x4, 8, GLfloat); CASE(GL_FLOAT_MAT3, 9, GLfloat); CASE(GL_FLOAT_MAT3x2, 6, GLfloat); CASE(GL_FLOAT_MAT3x4, 12, GLfloat); CASE(GL_FLOAT_MAT4, 16, GLfloat); CASE(GL_FLOAT_MAT4x2, 8, GLfloat); CASE(GL_FLOAT_MAT4x3, 12, GLfloat);#undef CASE default: fprintf(stderr, "Unknow type:0x%x/n", type); exit(EXIT_FAILURE); break; } return size;}enum VAO_IDs{Triangles,NumVAOs};enum Buffer_IDs{ ArrayBuffer0, ArrayBuffer1, NumBuffers };enum Attrib_IDs{vPostion = 0,vColor = 1};GLuint VAOs[NumVAOs];GLuint Buffers[NumBuffers];const GLuint NumVertices = 6;void init(){ GLuint program; glClearColor(1, 0, 0, 1); ShaderInfo shaders[] = { {GL_VERTEX_SHADER,vShader}, {GL_FRAGMENT_SHADER,fShader}, {GL_NONE,NULL} }; program = LoadShaders(shaders); glUseProgram(program); GLuint uboIndex; GLint uboSize; GLuint ubo; GLvoid *buffer; //GLuint glGetUniformBlockIndex(GLuint program,const char * uniformBlockName) //返回program中名稱為uniformBlockName的uniform塊的索引值。如果uniformBlockName不是一個合法的uniform程序塊,那么返回GL_INVALID_INDEX. uboIndex = glGetUniformBlockIndex(program, "Uniforms"); //返回編譯器分配的塊的大?。ǜ鶕niform塊的局部設置,編譯器可能會自動排除著色器中沒有用到的uniform變量)。 glGetActiveUniformBlockiv(program, uboIndex,GL_UNIFORM_BLOCK_DATA_SIZE,&uboSize); buffer = malloc(uboSize); if (buffer == NULL) { fprintf(stderr, "Unable to allocate buffer/n"); exit(EXIT_FAILURE); } else{ enum{Translate,Scale,Rotation,Enabled,NumUniforms}; GLfloat scale = 0.5; GLfloat translation[] = { 0.1, 0.1, 0.0 }; GLfloat rotation[] = { 90, 0.0, 0.0, 1.0 }; GLboolean enabled = GL_TRUE; const char*names[NumUniforms] = { "translation", "scale", "rotation", "enabled" }; GLuint indices[NumUniforms]; GLint size[NumUniforms]; GLint offset[NumUniforms]; GLint type[NumUniforms]; //void glGetUniformIndices(GLuint program,GLsizei uniformCount,const char** uniformNames,GLuint* uniformIndices); //返回所有uniformCount個uniform變量的索引位置,變量的名稱通過字符串數組uniformNames來指定,程序返回值保存在數組 //uniformIndices當中。在uniformNames中的每個名稱都是以NULL來結尾的,并且uniformNames和uniformIndices的數組元素 //都應該是uniformCount個。如果在uniformNames中給出的某個名稱不是當前啟用的uniform變量名稱,那么uniformIndices中對應 //的位置會記錄為GL_INVALID_INDEX. glGetUniformIndices(program, NumUniforms, names, indices); //獲得指定索引位置的偏移量和大小 glGetActiveUniformsiv(program, NumUniforms, indices, GL_UNIFORM_OFFSET, offset); glGetActiveUniformsiv(program, NumUniforms, indices, GL_UNIFORM_SIZE, size); glGetActiveUniformsiv(program, NumUniforms, indices,GL_UNIFORM_TYPE,type); memcpy((GLfloat*)buffer + offset[Scale], &scale, size[Scale] * TypeSize(type[Scale])); memcpy((GLfloat*)buffer + offset[Translate], &scale, size[Translate] * TypeSize(type[Translate])); memcpy((GLfloat*)buffer + offset[Rotation], &scale, size[Rotation] * TypeSize(type[Rotation])); memcpy((GLfloat*)buffer + offset[Enabled], &scale, size[Enabled] * TypeSize(type[Enabled])); glGenBuffers(1, &ubo); glBindBuffer(GL_UNIFORM_BUFFER, ubo); glBufferData(GL_UNIFORM_BUFFER, uboSize, buffer, GL_STATIC_DRAW); //void glBindBufferBase(GLenum target,GLuint index,GLuint buffer) //將緩存對象buffer與索引index的命名uniform塊關聯起來。target可以是GL_UNIFORM_BUFFER或者GL_TRANSFORM_FEEDBACK_BUFFER。 //index是uniform塊索引。 glBindBufferBase(GL_UNIFORM_BUFFER, uboIndex, ubo); } glGenVertexArrays(NumVAOs, VAOs); glBindVertexArray(VAOs[Triangles]); GLfloat vertices[NumVertices][2] = { {-0.90,-0.90}, {0.85,-0.90}, {-0.90,0.85}, {0.90,-0.85}, {0.90,0.90}, {-0.85,0.90} }; GLfloat colors[NumVertices][3] = { { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 1.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 1.0, 1.0, 1.0 }, }; glGenBuffers(NumBuffers, Buffers); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer0]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer1]); glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer0]); glVertexAttribPointer(vPostion, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vPostion); glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer1]); glVertexAttribPointer(vColor, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(vColor);}void display(void){ glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(VAOs[Triangles]); glDrawArrays(GL_TRIANGLES, 0, NumVertices); glFlush();}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(3,3); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMainLoop();}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛茸茸少妇高潮呻吟| 日韩国产在线看| www.欧美精品| 91高清视频在线免费观看| 欧美极品第一页| 97久久超碰福利国产精品…| 亚洲精品免费在线视频| 日本国产一区二区三区| 欧美激情一区二区三区高清视频| 日本成人精品在线| 国产成人精品视| 国产精品视频免费在线观看| 欧美日韩精品在线播放| 亚洲国产成人91精品| 亚洲一区二区三区视频播放| 国产香蕉一区二区三区在线视频| 国产日韩视频在线观看| 亚洲天堂av在线免费| 欧美精品在线看| 中文字幕亚洲无线码在线一区| 亚洲日本欧美日韩高观看| 国产欧美日韩精品丝袜高跟鞋| 91精品国产色综合久久不卡98口| 国产自摸综合网| 亚洲人永久免费| 欧美在线欧美在线| 日韩亚洲精品电影| 欧美激情久久久| 亚洲综合小说区| 国产成人精品视| 日韩男女性生活视频| 欧美自拍视频在线观看| 精品久久久999| 国产精品久久久久久久av电影| 国产精品xxxxx| 国产丝袜一区二区| 中文字幕亚洲一区在线观看| 日韩成人av网址| 国产免费一区二区三区香蕉精| 久久影视电视剧免费网站清宫辞电视| 国产欧美精品一区二区三区介绍| 成人激情综合网| 国产亚洲精品久久久久久牛牛| 国产亚洲精品美女久久久久| 欧美黑人极品猛少妇色xxxxx| 欧美日韩另类视频| 91精品久久久久| 久久97精品久久久久久久不卡| 国内精品在线一区| 88国产精品欧美一区二区三区| 日韩福利伦理影院免费| 国产伦精品一区二区三区精品视频| 日韩不卡在线观看| 久久99精品久久久久久青青91| 海角国产乱辈乱精品视频| 中文字幕亚洲欧美日韩2019| 欧美精品久久久久久久久久| 国产精品视频久久久| 欧美大成色www永久网站婷| 日韩激情视频在线播放| 亚洲午夜精品视频| 亚洲欧美制服另类日韩| 性色av一区二区咪爱| 欧美丝袜美女中出在线| 国a精品视频大全| 亚洲老司机av| 成人网在线免费观看| 96sao精品视频在线观看| 日韩美女在线观看| 国产日本欧美在线观看| 国产精品一区二区久久久| 中文字幕在线视频日韩| 欧美老女人性生活| 国产精品视频最多的网站| 国产色视频一区| 国产大片精品免费永久看nba| 欧美xxxx综合视频| 色先锋资源久久综合5566| 欧美日韩国产成人| 亚洲一区二区三区视频| 尤物九九久久国产精品的分类| 精品久久久久久久久国产字幕| 日韩精品在线免费播放| 久久精品欧美视频| 欧美日韩国产精品专区| 久久躁日日躁aaaaxxxx| 欧美另类精品xxxx孕妇| 中日韩美女免费视频网站在线观看| 日韩美女免费线视频| 久久久国产精品一区| 国产成人一区二区三区小说| 欧美一区三区三区高中清蜜桃| 欧美电影免费观看| 日韩一区二区三区国产| 国产精品av电影| 日韩精品免费电影| 国产精品久久久久久久久久久久久| 欧美激情第三页| 亚洲激情视频在线观看| 欧美性猛交xxxx免费看久久久| 国产在线拍偷自揄拍精品| 97成人精品视频在线观看| 日韩乱码在线视频| 亚洲综合大片69999| 国产精品成人久久久久| 久久视频在线视频| www.久久久久久.com| 精品一区二区电影| 国产精品久久二区| 欧美性猛交xxxx富婆| 在线亚洲欧美视频| 精品国产一区二区在线| 国内精品久久久久影院优| 亚洲国产天堂久久综合网| 国内精品美女av在线播放| 成人国产精品日本在线| 久久亚洲私人国产精品va| 久久av在线播放| 国产精品国语对白| 亚洲在线观看视频| 亚洲精品xxxx| 最近2019年中文视频免费在线观看| 亚洲美女视频网| 国产精品久久久久影院日本| 亚洲高清免费观看高清完整版| 九九久久精品一区| 成人精品一区二区三区电影黑人| 亚洲一区二区在线| 国产欧美日韩精品丝袜高跟鞋| 久久福利视频导航| 久久人人97超碰精品888| 91高清视频在线免费观看| 久久精品中文字幕免费mv| 97超碰国产精品女人人人爽| 亚洲女人天堂成人av在线| 91精品国产高清自在线| 欧美专区在线视频| 国产成人在线亚洲欧美| 国产啪精品视频网站| 性欧美在线看片a免费观看| 亚洲999一在线观看www| 国内精品400部情侣激情| 亚洲人精选亚洲人成在线| 成人国产精品日本在线| 国产成人精品久久二区二区91| 国产精品中文字幕久久久| 精品国产精品三级精品av网址| 日产精品99久久久久久| 成人欧美一区二区三区黑人孕妇| 97在线观看视频| 日韩最新av在线| 午夜精品蜜臀一区二区三区免费| 亚洲天堂网站在线观看视频| 日韩电影免费在线观看| 亚洲风情亚aⅴ在线发布| 久久久久国产精品www| 欧美激情一区二区久久久| 国产精品wwwwww| 97精品一区二区视频在线观看| 欧美性猛交xxxx免费看漫画| 久久国产精品电影| 在线观看欧美成人| 91免费视频国产| 91久久精品日日躁夜夜躁国产|