要回答您关于上次调用 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;
对应那些顶点属性。