【发布时间】:2015-05-02 03:19:35
【问题描述】:
所以我有一个工作程序,可以显示从高度图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但是我遇到了问题。当我只使用内置的 gl_Normal 作为我的法线时,一切正常。当我使用带有布局限定符的普通声明时,它不起作用。无论如何,顶点显示得很好。我不确定我在这里做错了什么。
这里是缓冲区的生成:
glGenBuffers(1, &TerrainPVBO);
glBindBuffer(GL_ARRAY_BUFFER, TerrainPVBO);
glBufferData(GL_ARRAY_BUFFER, Terrains[IID].Points.size() * sizeof(vec3f), &Terrains[IID].Points[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glGenBuffers(1, &TerrainNVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TerrainNVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Terrains[IID].Normals.size() * sizeof(vec3f), &Terrains[IID].Normals[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
然后在我的渲染函数下:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, TerrainIVBO);
glPatchParameteri(GL_PATCH_VERTICES, 3);
glDrawElements(GL_PATCHES, Terrains[IID].Index.size(), GL_UNSIGNED_INT, 0);
如果我不使用 VertexAttribArray/Pointer,而在绘图函数中使用 glVertexPointer/glNormalPointer(在着色器中使用 gl_Normal/gl_Vertex),一切正常。
这是着色器,如果有帮助的话:
#version 420
uniform mat3 NormalMatrix;
layout (location = 0) in vec4 vertex;
layout (location = 1) in vec3 normal;
out gl_PerVertex{
vec4 gl_Position;
};
out vec3 normalTCS;
void main()
{
gl_Position = vertex;
normalTCS = NormalMatrix * normal;
}
我确定我在这里做了一些愚蠢的事情,但我发现这个过程有点令人困惑。任何帮助将不胜感激!
【问题讨论】: