我正在绘制一个交错缓冲区 - 它是一个通用的顶点属性缓冲区。布局由三个浮点数作为顶点坐标和另外两个浮点属性组成,交错:
| float | float | float | float | float |
| coords.x | coords.y | coords.z | attrib1 | attrib2 |
|_______vertex coordinates_______|_________|_________|
我希望能够只使用glVertexAttribPointer
来绘制它,这确实有效 - 但是,只有在我也使用 glEnableClientState(GL_VERTEX_ARRAY)
和{ {1}},即使我没有在着色器中访问glVertexPointer()
!
最小顶点着色器(GLSL 1.20):
gl_Vertex
绘制缓冲区的代码:
#version 120
attribute vec3 coords;
attribute float attrib1;
attribute float attrib2;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * vec4(coords.x, coords.y, coords.z, 1.0);
// attrib1 and 2 are used here but this is not relevant
}
上面的代码中的一切正常如果我取消注释两个带注释的行;否则,什么都没画。
这真让我难过......我错过了某个地方的状态变化,还是有什么我忘记启用?
编辑:我没有使用VAO,并且除了您在此处看到的内容之外,没有其他州设置。没有绑定纹理或其他缓冲区。
答案 0 :(得分:1)
来自评论中的链接着色器代码:
#version 120
#pragma optimize(on)
#pragma debug(on)
attribute vec4 coords; // we only input a vec3, so w defaults to 1.0
attribute float lambertian_main;
attribute float lambertian_side;
varying float height;
varying float lambertian_main_frag;
varying float lambertian_side_frag;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * coords;
lambertian_main_frag = lambertian_main;
lambertian_side_frag = lambertian_side;
height = gl_Vertex.y;
}
你 在这里使用gl_Vertex
...如果使用它,它将始终获得属性ID 0.这完全解释了你在问题中看到和描述的行为和评论。只需使用height = coords.y
,一切都会像预期的那样发挥作用。