glVertexAttribPointer,更改顶点属性布局

时间:2013-08-08 10:30:31

标签: opengl

我正在编写一个glsl 1.3+查看器,我需要更改着色器的来源,而不是删除然后重新创建... 但是,有一些关于opengl的人没有给出关于重新定义顶点属性布局的信息。

之前对

的调用会发生什么
    glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

用其他posAttrib召回时? 如何从顶点属性数组中“取消绑定”着色器输入变量? 如何使相同的posAttrib指向顶点属性数组中的不同位置?

1 个答案:

答案 0 :(得分:2)

要回答关于之前调用glVertexAttribPointer会发生什么情况的问题,我相信属性指针刚刚被glVertexAttribPointer的最新调用重新分配。

此用法中没有“解除绑定”。您只是更改引用,没有创建额外的内存。最后一个输入参数是您提供的posAttrib作为VBO的偏移量。如果您的posAttrib包含顶点坐标,法线坐标和纹理坐标,那么您可以执行以下操作,假设您定义了一个新的AttributedVertex类型,其中包含8 floats(顶点为3, 3表示正常,2表示纹理坐标)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), (void *)(3*sizeof(GLfloat));
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), (void *)(6*sizeof(GLfloat));

你的顶点着色器应该有3个属性,比如

attribute vec3 inPosition;
attribute vec3 inNormal;
attribute vec2 inTexCoord;

对应那些顶点属性。