glvertexattribpointer 问题的 glsl 布局

glsl layout with glvertexattribpointer issues

所以我有一个工作程序可以显示从高度图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但我遇到了问题。当我只对我的法线使用内置 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;
} 

我确定我在这里做了一些愚蠢的事情,但我发现这个过程有点令人困惑。任何帮助将不胜感激!

我不太确定你的 isse 是什么,但是对你的法线使用 GL_ELEMENT_ARRAY_BUFFER 是行不通的。 glVertexAttribPointer() 调用将始终引用当前绑定的 GL_ARRAY_BUFFER,因此您将 noraml 设置为与您的位置相同。

但是,glNormalPointer() 的工作方式相同,所以我完全不清楚这在以前是如何工作的。