如果没有glVertexPointer,通用顶点属性缓冲区似乎不起作用

时间:2014-05-22 01:13:41

标签: c++ opengl glsl vertex-shader vertex-array

我正在绘制一个交错缓冲区 - 它是一个通用的顶点属性缓冲区。布局由三个浮点数作为顶点坐标和另外两个浮点属性组成,交错:

| 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,并且除了您在此处看到的内容之外,没有其他州设置。没有绑定纹理或其他缓冲区。

1 个答案:

答案 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,一切都会像预期的那样发挥作用。