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

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

Opengl學習程序之uniform

2019-11-11 04:23:27
字體:
來源:轉載
供稿:網友

實現程序:

#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();}
上一篇:設計模式---工廠模式

下一篇:隨機 Random

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久亚洲精品中文字幕| 一区二区三区四区视频| 亚洲欧洲一区二区三区在线观看| 国内精品国产三级国产在线专| 日韩三级成人av网| 91国产中文字幕| 一本色道久久88综合亚洲精品ⅰ| 精品国产乱码久久久久酒店| 国产精品h片在线播放| 黄色成人在线免费| 精品成人av一区| 国产精品久久久久久超碰| 日韩欧美中文字幕在线观看| 国产亚洲精品美女| 亚洲欧美日韩在线一区| 亚洲国产精品va在看黑人| 国产精品爽黄69天堂a| 91爱爱小视频k| 欧美精品亚州精品| 久久精品国产成人精品| 欧美成人精品一区| 亚洲韩国青草视频| 国产午夜一区二区| 久久精品中文字幕一区| 5566成人精品视频免费| 国产精品999999| 亚洲精品之草原avav久久| 成人精品久久久| 国产成人激情小视频| 高清亚洲成在人网站天堂| 日韩免费高清在线观看| 亚洲97在线观看| 国产精品久久久久久一区二区| 欧美精品制服第一页| 欧美日韩电影在线观看| 91久久嫩草影院一区二区| 57pao国产成人免费| 欧美在线视频网| 日韩久久精品电影| 国产成人极品视频| 欧美视频第一页| 日韩欧美精品网站| www.日韩不卡电影av| 狠狠色香婷婷久久亚洲精品| 亚洲欧美日韩在线高清直播| 欧美日韩精品在线观看| 欧美又大粗又爽又黄大片视频| 国产区精品视频| 亚洲天堂免费观看| 亚洲美女自拍视频| 91国语精品自产拍在线观看性色| 亚洲自拍另类欧美丝袜| 国产精品第一第二| 欧美极度另类性三渗透| 国产91精品久久久| 亚洲香蕉伊综合在人在线视看| 久久综合久久美利坚合众国| 亚洲在线视频福利| 亚洲欧美一区二区精品久久久| 两个人的视频www国产精品| 超碰97人人做人人爱少妇| 91精品久久久久久久久久入口| 久久亚洲精品毛片| 日韩av在线不卡| 欧亚精品中文字幕| 久久99久国产精品黄毛片入口| 久久久久久久久综合| 美女少妇精品视频| 精品日韩视频在线观看| 亚洲精品福利视频| 清纯唯美日韩制服另类| 日韩av在线网页| 亚洲第一中文字幕| 92看片淫黄大片欧美看国产片| 国产视频在线观看一区二区| 在线视频欧美性高潮| 91日韩在线视频| 欧美黄色片在线观看| 久久久久久九九九| 国产亚洲精品日韩| 欧美性xxxxxxxxx| 亚洲а∨天堂久久精品喷水| 久久久久久久久91| 精品久久久久久久久久久久| 日韩的一区二区| 精品美女久久久久久免费| 国产欧美一区二区三区在线看| 亚洲综合在线小说| 亚洲色图av在线| 日韩电影中文 亚洲精品乱码| 日韩av在线影院| 日韩电影网在线| 欧美亚洲国产日韩2020| 日韩美女在线看| 国产一区二区久久精品| 亚洲成人精品视频| 性欧美亚洲xxxx乳在线观看| 3344国产精品免费看| 青草青草久热精品视频在线网站| 正在播放亚洲1区| 日韩中文字在线| 亚洲aa中文字幕| 国产成人自拍视频在线观看| 欧美黑人性猛交| 日韩精品中文字幕视频在线| 国产精品第3页| 日韩av在线一区二区| 中文字幕免费精品一区| 成人午夜在线视频一区| 国产精品日韩精品| 亚洲欧美中文字幕在线一区| 在线播放国产一区中文字幕剧情欧美| 亚洲精品中文字幕女同| 九九久久精品一区| 欧美日韩美女视频| 97视频在线观看免费| 国产成人小视频在线观看| 日韩不卡中文字幕| 亚洲日本aⅴ片在线观看香蕉| 欧美贵妇videos办公室| 欧美精品免费在线| 亚洲成人国产精品| 成人字幕网zmw| 久久久精品视频成人| 国产精品黄色av| 日韩资源在线观看| 国产精品一区=区| 伊人伊成久久人综合网小说| 亚洲欧美精品一区| 欧美日韩在线视频一区| 日韩美女福利视频| 日本精品一区二区三区在线播放视频| 久久久久久综合网天天| 91精品国产91久久久久久最新| 欧美日韩免费看| 国产精品都在这里| 国产一区二区三区欧美| 亚洲最大福利视频网站| 国产一区二区三区四区福利| 久久久久久成人精品| 国产成人久久久精品一区| 欧美激情第6页| 亚洲精品不卡在线| 欧美—级高清免费播放| 欧美野外猛男的大粗鳮| 日韩电影在线观看免费| 国产精品一区二区三区毛片淫片| 国产免费观看久久黄| 欧美精品日韩www.p站| 性色av一区二区三区在线观看| 亚洲国产精品嫩草影院久久| 亚洲精品99久久久久| 亚洲日韩中文字幕在线播放| 欧美精品情趣视频| 疯狂做受xxxx欧美肥白少妇| 国产欧亚日韩视频| 国产色综合天天综合网| 日韩av中文字幕在线播放| 日韩禁在线播放| 国产精品自拍偷拍| 国产精品九九久久久久久久| 亚洲色图欧美制服丝袜另类第一页| 亚洲欧美福利视频| 亚洲精品国产精品自产a区红杏吧|