使用glVertexAttribPointer设置内置的顶点属性,例如gl_Vertex、gl_Normal

7

我需要使用glVertexAttribPointer将顶点属性发送到期望内置的着色器中(如gl_Vertex,gl_Color等)。

glVertexAttribPointer函数需要指定每个内置属性的索引(或位置)。在NVidia实现中,我可以这样做,因为每个属性的位置是固定的(请参见http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php的“自定义属性”部分),但是我不确定ATI实现中的位置。

另外,当尝试获取以“gl_”开头的任何属性的位置时,函数glGetAttribLocation将返回-1。

我认为我可能遗漏了一些东西,这是一个微不足道的问题,但是我没有找到ATI的正确解决方案。


欢迎来到SO,希望您已经阅读了FAQ - Christian Rau
1个回答

7
内置属性数组不是使用glVertexAttribPointer设置的,而是使用类似glVertexPointerglColorPointer等函数设置的。您可以通过调用glEnableClientState并使用像GL_VERTEX_ARRAYGL_COLOR_ARRAY等常量来启用它们,而不是使用glEnableVertexAttribArray

尽管在nVidia上glVertexAttribPointer可能有效,但由于他们将自定义属性索引与内置属性别名化,这不符合标准规范,并且我确定您不能在任何其他硬件供应商那里期望此结果。因此,请为自定义属性使用glVertexAttribPointer,并结合匹配的启用/禁用函数使用glVertexPointer/glNormalPointer/...函数设置内置属性。

请注意,内置属性和相关函数已过时。因此,如果要编写现代OpenGL代码,则应该定义自己的属性。但是,如果您需要支持旧版着色器或暂时不关心向前兼容性,请继续使用它们。


太好了!这正是我怀疑的。然而,我尝试使用glVertexAttribPointer使其工作,因为在新版本的OpenGL中,gl*Pointer调用已被弃用。谢谢!!! - Pau Baiget
4
@Pau,这些内置属性已经被弃用,因此如果你在使用它们,你已经在使用被弃用的功能。如果这个答案有帮助的话,请考虑接受它。 - Christian Rau
谢谢Christian,你的回答确实非常有帮助。这是我在stackoverflow上的第一个问题。 - Pau Baiget
我发现这种非标准行为在 AMD 上也能工作(MabBook Pro 2011 和 Mac Pro 2013)。直到找到了这个答案(谢谢!),我才明白为什么它在 Intel 实现上不起作用。 - Yoav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接