GLSL 布局与 glvertexattribpointer 问题



所以我有一个工作程序,显示从高度图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但我遇到了问题。当我只是将内置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()的工作方式相同,因此我不清楚这在以前是如何工作的。

最新更新