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