所以我有一个工作程序,显示从高度图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但我遇到了问题。当我只是将内置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);
如果我不使用 The 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;
}
我确定我在这里做了一些愚蠢的事情,但我发现这个过程有点令人困惑。任何帮助将不胜感激!
我不太确定你的 isse 是什么,但对你的法线使用 GL_ELEMENT_ARRAY_BUFFER
是行不通的。glVertexAttribPointer()
调用将始终引用当前绑定的GL_ARRAY_BUFFER
,因此您将noraml设置为与您的位置相同。
但是,glNormalPointer()
的工作方式相同,因此我不清楚这在以前是如何工作的。