我将正常数据缓冲到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。
发布于 2016-03-27 17:21:41
当使用核心配置文件和VAOs时,不存在任何固定函数顶点属性.
为着色器中的法线定义自己的顶点属性:
in vec3 myVertexNormal;获取属性位置(或将其绑定到您选择的位置。):
normalsLocation = glGetAttribLocation(program, "myVertexNormal");然后将glVertexAttribPointer与位置一起使用:
glVertexAttribPointer(normalsLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);在核心配置文件中,您还必须对位置、纹理坐标等进行此操作。OpenGL实际上并不关心数据是什么,只要顶点着色器为gl_Position分配一些东西,而片段着色器为它的输出分配一些东西。
如果您坚持使用不推荐的固定函数属性和gl_Normal,则使用glNormalPointer代替。
https://stackoverflow.com/questions/36250075
复制相似问题