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

时间:2016-03-27 16:58:20

标签: c++ opengl

我将普通数据缓冲到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一起使用。

1 个答案:

答案 0 :(得分:4)

你没有。使用核心配置文件和VAO时,不存在任何固定功能顶点属性。

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

in vec3 myVertexNormal;

获取属性位置(或bind it to a location of your choice):

normalsLocation = glGetAttribLocation(program, "myVertexNormal");

然后将glVertexAttribPointer与位置一起使用:

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

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

如果您坚持使用已弃用的固定功能属性和gl_Normal,请改用glNormalPointer