Layout glsl布局与GLVertexAttribute指针问题

Layout glsl布局与GLVertexAttribute指针问题,layout,glsl,vbo,Layout,Glsl,Vbo,所以我有一个工作程序,显示从高度地图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但我遇到了一些问题。当我使用内置的gl_法线作为法线时,一切正常。当我使用布局限定符声明的法线时,它不起作用。不管怎样,顶点都显示得很好。我不确定我在这里做错了什么 以下是缓冲区的生成: glGenBuffers(1, &TerrainPVBO); glBindBuffer(GL_ARRAY_BUFFER, TerrainPVBO); glBufferData(GL_ARRAY_BUFFER, Te

所以我有一个工作程序,显示从高度地图生成的地形网格。我现在想使用布局限定符来声明顶点属性,但我遇到了一些问题。当我使用内置的gl_法线作为法线时,一切正常。当我使用布局限定符声明的法线时,它不起作用。不管怎样,顶点都显示得很好。我不确定我在这里做错了什么

以下是缓冲区的生成:

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);
如果我不使用VertexAttributeArray/指针,并且在绘图函数中使用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\u元素\u数组\u缓冲区
是行不通的。
glvertexattributepointer()
调用将始终引用当前绑定的
GL\u数组\u缓冲区
,因此您将NORAML设置为与您的位置相同


然而,
glNormalPointer()
的工作原理是一样的,所以我不清楚这以前是如何工作的。

我知道我在做一些愚蠢的事情。我的正常值看起来和以前不一样了,但看起来确实很准确。它是元素数组的问题是在我转换成这个方法时才产生的。这就是它以前成功的原因。干杯