我必须使用glVertexAttribPointer将顶点属性发送给着色器,将它们视为内置(gl_Vertex
,gl_Color
等)。
glVertexAttribPointer
函数需要指定每个内置属性的索引(或位置)。我可以在NVidia实现上做到这一点,因为每个属性的位置都是固定的(请参阅“自定义属性”部分的http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php),但是我不确定ATI实现中的位置。
此外,当尝试获取以“gl _”开头的任何属性的位置时,函数glGetAttribLocation
将返回-1。
我想我错过了一些东西,这是一个微不足道的问题,但是我没有为ATI找到正确的解决方案。
答案 0 :(得分:7)
内置属性数组未使用glVertexAttribPointer
设置,但使用glVertexPointer
, glColorPointer
, ...等函数。您可以使用GL_VERTEX_ARRAY
,GL_COLOR_ARRAY
,...代替glEnableVertexAttribArray
等常量调用glEnableClientState
来启用这些功能。
虽然nVidia glVertexAttribPointer
可能有效,但由于它们具有内置属性的自定义属性索引的别名,这不符合标准,我相信你不能指望任何其他硬件供应商。因此,请确保将glVertexAttribPointer
用于bultin属性的自定义属性和glVertexPointer/glNormalPointer/...
函数,以及匹配的启用/禁用函数。
请记住,无论如何都不推荐使用内置属性以及上述功能。因此,如果您想编写现代OpenGL代码,您应该定义自己的属性。但也许你必须支持传统着色器或者不关心前向兼容性。