2

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

上一次调用会发生什么

    glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

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

4

1 回答 1

3

要回答您关于先前调用 会发生什么的问题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;

对应于那些顶点属性。

于 2013-08-08T21:29:05.670 回答