带有 glvertexattribpointer 问题的 glsl 布局

Posted

技术标签:

【中文标题】带有 glvertexattribpointer 问题的 glsl 布局【英文标题】:glsl layout with glvertexattribpointer issues 【发布时间】: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;
 

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我知道我在做一些愚蠢的事情。我的法线似乎与以前不同,但它们似乎确实是准确的。它是 element_array 的问题仅在我转换为此方法时才产生。这就是它以前起作用的原因。干杯!

以上是关于带有 glvertexattribpointer 问题的 glsl 布局的主要内容,如果未能解决你的问题,请参考以下文章

缓冲区和 glVertexAttribPointer 之间的关系

如何使用 glVertexAttribPointer() 添加非数组值

Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)

glVertexAttribPointer 出现 JOGL 错误

glVertexAttribPointer 返回 GL_INVALID_OPERATION

OpenGL glVertexAttribPointer 正常