【问题标题】:glVertexAttribPointer on built-in vertex attributes like gl_Vertex, gl_NormalglVertexAttribPointer 上的内置顶点属性,如 gl_Vertex、gl_Normal
【发布时间】:2011-09-22 15:17:57
【问题描述】:

我必须使用 glVertexAttribPointer 将顶点属性发送到期望它们作为内置的着色器(gl_Vertexgl_Color 等)。

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

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

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

【问题讨论】:

  • 欢迎来到 SO,我希望你已经阅读了FAQ

标签: opengl attributes glsl vertex ati


【解决方案1】:

内置属性数组不是用glVertexAttribPointer设置的,而是用glVertexPointer, glColorPointer, ...这样的函数设置的。您可以通过使用 GL_VERTEX_ARRAYGL_COLOR_ARRAY、... 等常量调用 glEnableClientState 来启用这些功能,而不是 glEnableVertexAttribArray

而在 nVidia glVertexAttribPointer 上可能会起作用,由于它们的自定义属性索引与内置属性的别名,这不符合标准,我相信你不能指望任何其他硬件供应商这样做。因此,请确保将glVertexAttribPointer 用于自定义属性,将glVertexPointer/glNormalPointer/... 函数用于bultin 属性,以及匹配的启用/禁用函数。

请记住,无论如何,内置属性以及提到的函数都已被弃用。因此,如果您想编写现代 OpenGL 代码,则无论如何都应该定义自己的属性。但也许您现在必须支持旧版着色器或不关心前向兼容性。

【讨论】:

  • 太棒了!这就是我所怀疑的。但是,我尝试使用 glVertexAttribPointer 让它工作,因为在较新版本的 OpenGL 中不推荐使用 gl*Pointer 调用。谢谢!!!
  • @Pau bultin 属性无论如何都已弃用,因此如果您使用这些属性,则说明您已经使用了已弃用的功能。如果答案有帮助,接受将不胜感激。
  • 感谢 Christian,您的回答确实很有帮助。这是我关于 stackoverflow 的第一个问题。
  • 我发现非标准行为也适用于 AMD(MabBook Pro 2011 和 Mac Pro 2013)。在找到这个答案之前,我无法理解为什么它不适用于英特尔实现(谢谢!)。
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
相关资源
最近更新 更多