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

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

Opengl學習程序之uniform

2019-11-11 04:56:22
字體:
來源:轉載
供稿:網友

實現程序:

#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"); //返回編譯器分配的塊的大小(根據uniform塊的局部設置,編譯器可能會自動排除著色器中沒有用到的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
久久精品99无色码中文字幕| 色av中文字幕一区| 亚洲网在线观看| 亚洲国产精品va在线观看黑人| 日韩美女在线观看| 欧美成人三级视频网站| 精品日韩中文字幕| 亚洲精品久久久久| 亚洲视频免费一区| 欧美色xxxx| 亚洲韩国日本中文字幕| 日韩在线视频二区| 国产福利视频一区| 国产成人精品在线观看| 国产成人精品久久二区二区91| 国产欧美精品在线播放| 欧美精品videos性欧美| 色视频www在线播放国产成人| 综合网日日天干夜夜久久| 久久亚洲国产精品成人av秋霞| 尤物九九久久国产精品的特点| 色哟哟网站入口亚洲精品| 国产精品成人国产乱一区| 亚洲精品欧美一区二区三区| 2023亚洲男人天堂| 一级做a爰片久久毛片美女图片| 国产精品久久久| 精品美女久久久久久免费| 欧美国产日韩视频| 亚洲国产精品电影在线观看| 日韩一区二区三区在线播放| 日韩视频免费大全中文字幕| 国产精品日韩精品| 久久精品视频免费播放| 精品国产精品三级精品av网址| 欧美成年人在线观看| 一区二区日韩精品| 日韩va亚洲va欧洲va国产| 日韩有码在线视频| 久久久久久久影视| 日日骚av一区| 国产在线观看91精品一区| 欧美激情2020午夜免费观看| 欧美电影在线免费观看网站| 欧美成人午夜剧场免费观看| 91免费精品国偷自产在线| 91成人福利在线| 久久久亚洲影院你懂的| 国产成人精品av在线| 在线精品国产成人综合| 国产精品久久久久免费a∨大胸| 国产精品一区久久久| 91av在线影院| 欧美激情亚洲精品| 精品高清一区二区三区| 97国产精品久久| 亚洲人成人99网站| 亚洲欧美在线x视频| 日韩欧美在线视频| 色99之美女主播在线视频| 国产成人中文字幕| www.日韩.com| 九九久久综合网站| 国产精品日韩欧美综合| 欧美成在线观看| 播播国产欧美激情| 亚洲在线第一页| 亚洲欧美成人精品| 亚洲国产精品成人精品| 日韩大陆欧美高清视频区| 午夜剧场成人观在线视频免费观看| 亚洲免费电影一区| 九色精品免费永久在线| 成人444kkkk在线观看| 国产精品久久久久77777| 日韩在线视频国产| 一区二区三区高清国产| 国产精品9999| 亚洲视频在线视频| 亚洲精品一区二区久| 亚洲一区第一页| 美日韩精品视频免费看| 国产精品久久久久久久久久免费| 亚洲最新av在线网站| 日本欧美黄网站| 成人午夜小视频| 久久久久国产一区二区三区| 色综合伊人色综合网站| 亚洲欧美制服中文字幕| 午夜精品福利电影| 永久免费毛片在线播放不卡| 久久久久久久久久久网站| 欧美视频第一页| 97超级碰在线看视频免费在线看| 日韩在线中文字| 国产成人福利网站| 久久夜精品va视频免费观看| 在线国产精品视频| 日本sm极度另类视频| 国产亚洲视频在线观看| 日韩精品中文字| 2018国产精品视频| 日韩69视频在线观看| 国自产精品手机在线观看视频| 日韩在线中文视频| 麻豆国产va免费精品高清在线| 欧洲亚洲妇女av| 午夜精品一区二区三区在线视| 91黑丝高跟在线| 黑人精品xxx一区| 91精品视频大全| 一区二区三区美女xx视频| 久久久久久久国产精品视频| 色婷婷综合久久久久| x99av成人免费| 国产精品视频男人的天堂| 欧美激情va永久在线播放| 久久久亚洲影院你懂的| 精品国产31久久久久久| 日韩视频中文字幕| 国产精品视频永久免费播放| 久久露脸国产精品| 亚洲精品一区中文字幕乱码| 欧美日韩中文字幕在线| 久久久免费高清电视剧观看| 96pao国产成视频永久免费| 曰本色欧美视频在线| 国产精品一区二区久久久| 亚洲免费伊人电影在线观看av| 亚洲第一福利网站| 在线播放国产一区中文字幕剧情欧美| 日韩欧美成人免费视频| 久久精品色欧美aⅴ一区二区| 日韩欧美主播在线| 国产精品美乳一区二区免费| 亚洲国产精品一区二区久| 伊人成人开心激情综合网| 亚洲午夜性刺激影院| 色综合伊人色综合网站| 日韩av在线一区二区| 国内偷自视频区视频综合| 亚洲国产97在线精品一区| 国产日韩一区在线| 欧美激情日韩图片| 91精品免费看| 最近更新的2019中文字幕| 久久免费视频网站| 精品国内亚洲在观看18黄| 一区二区三区视频免费在线观看| 视频一区视频二区国产精品| 国产视频在线观看一区二区| 91精品国产高清自在线| 久久成人av网站| 久久亚洲春色中文字幕| 美女撒尿一区二区三区| 欧美小视频在线| 国产69久久精品成人看| 国产精品极品在线| 亚洲成**性毛茸茸| 人体精品一二三区| 国产在线久久久| 98视频在线噜噜噜国产| 亚洲美女久久久| 91中文在线视频|