UBO笔记
UBO的引入对渲染引擎的影响比较大。
const char *VertexShaderSource= "void main()" "{" " gl_Position=ftransform();" "}"; const char* FragmentShaderSource= "layout(std140) uniform material" "{" " vec4 ambient;" " vec4 diffuse;" " float specular;" "};" "void main()" "{" " gl_FragColor=(ambient+diffuse)*specular;" "}"; //获取UniformBlock大小 uniformBlockIndex = glGetUniformBlockIndex(prog_id, "material"); glGetActiveUniformBlockiv(prog_id, uniformBlockIndex,GL_UNIFORM_BLOCK_DATA_SIZE, &uniformBlockSize); //创建UniformBuffer glGenBuffers(1, &buffer_id); glBindBuffer(GL_UNIFORM_BUFFER, buffer_id); glBufferData(GL_UNIFORM_BUFFER, uniformBlockSize, colors, GL_DYNAMIC_DRAW); //绑定UniformBuffer与UniformBlock glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer_id); glUniformBlockBinding(prog_id, uniformBlockIndex, 0);
这是基本用法,很简单,比较麻烦的是获取ubo信息的方法,因为材质系统的设计必须和shader的参数关联,也就是和ubo关联。
获取所有Uniform
glGetProgramiv(GL_ACTIVE_UNIFORMS);//获取uniform数量
glGetActiveUniformName();//根据下标获取uniform
获取所有UniformBlock
glGetProgramiv(GL_ACTIVE_UNIFORM_BLOCKS);
glGetActiveUniformBlockName();
获取UniformBlock中的所有Uniform
glGetActiveUniformBlockiv(GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS);
glGetActiveUniformBlockiv(GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES);
glGetActiveUniformName()
发现个问题
layout(std140){mat3 normalMat;mat4 modelviewMat;};
layout(std140){mat4 normalMat;mat4 modelviewMat;};
第二个才能正确传入,第一个不能传入normalMat,在ati显卡上
 
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号