使用glVertexAttribPointer时,应该为gl_Normal属性使用什么索引

When using glVertexAttribPointer, what index should I use for the gl_Normal attribute?

本文关键字:属性 Normal 索引 什么 gl glVertexAttribPointer 使用      更新时间:2023-10-16

我将正常数据缓冲到VBO,然后使用glVertexAttribPointer:指向它

glVertexAttribPointer(<INDEX?>, 3, GL_FLOAT, GL_FALSE, 0, NULL);

但是,如果我希望数据绑定到着色器中的gl_Normal属性,那么第一个参数索引应该使用什么值?

我正在使用NVidia卡,我在这里阅读https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php对于这些类型的卡,gl_ Normal总是在索引2处。但是我怎么知道其他卡的gl_Normal在这个索引处呢?

此外,使用索引2似乎不起作用,着色器中的gl_Normal数据全部为(0,0,0)。

我知道glGetAttribLocation和glBindAttribLocation,但文档特别指出,如果尝试使用以"gl_"开头的内置顶点属性之一,该函数将抛出错误。

编辑:将OpenGL 3.0与GLSL 130。

您没有。使用核心轮廓和VAO时,不存在任何固定函数顶点属性。

为着色器中的法线定义自己的顶点属性:

in vec3 myVertexNormal;

获取属性位置(或将其绑定到您选择的位置):

normalsLocation = glGetAttribLocation(program, "myVertexNormal");

然后使用位置为的glVertexAttribPointer

glVertexAttribPointer(normalsLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);

在核心配置文件中,还必须对位置、纹理坐标等执行此操作。OpenGL实际上并不关心数据是什么,只要顶点着色器为gl_Position指定一些内容,片段着色器为其输出指定一些内容即可。

如果您坚持使用不推荐使用的固定函数属性和gl_Normal,请改用glNormalPointer