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显卡上

posted on 2013-01-15 14:21  SoMiSoDo  阅读(1067)  评论(0)    收藏  举报

导航