glVertexAttrib *:预定义了哪些属性索引?

时间:2009-02-09 12:53:10

标签: opengl

glVertexAttrib函数系列允许向每个顶点添加通用属性。 您可以设置与数据关联的索引。但是,您无法任意选择索引,因为我发现使用低于4的索引将破坏标准(Normal / TexCoord)属性,加上0是顶点位置。 我怎样才能找到,这将是第一个用于自定义属性的真正自由索引?

3 个答案:

答案 0 :(得分:7)

我找到了一个列出nvidia硬件预定义索引的网站:

http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php

  

不幸的是有一定的   在NVidia上使用它时的限制   硬件。根据NVidia的说法:“GLSL   试图消除混叠   顶点属性,但这是不可或缺的   NVIDIA的硬件方法和   维持所必需的   与现有OpenGL的兼容性   NVIDIA客户的应用程序   依靠。 NVIDIA的GLSL实施   因此不允许内置   顶点属性与a碰撞   通用顶点属性   分配给特定的顶点   属性索引用   glBindAttribLocation。例如,你   不应该使用gl_Normal(内置的   顶点属性)也使用   glBindAttribLocation绑定泛型   顶点属性名为“whatever”to   顶点属性索引2因为   gl_Normal别名为索引2.“

     

换句话说,NVidia硬件    索引保留给内置    属性:

  • gl_Vertex 0
  • gl_Normal 2
  • gl_Color 3
  • gl_SecondaryColor 4
  • gl_FogCoord 5
  • gl_MultiTexCoord0 8
  • gl_MultiTexCoord1 9
  • gl_MultiTexCoord2 10
  • gl_MultiTexCoord3 11
  • gl_MultiTexCoord4 12
  • gl_MultiTexCoord5 13
  • gl_MultiTexCoord6 14
  • gl_MultiTexCoord7 15

答案 1 :(得分:2)

你不应该选择自己的指数。 GL可以通过代码中的属性名称通过glGetAttribLocation函数为您提供免费的(如果您在链接程序后执行此操作)。

我从未遇到过这个问题...但不幸的是,我没有自己的着色器包装器代码(在工作时)可以解释原因。

答案 2 :(得分:2)

您实际上可以专门使用顶点属性数组,因此完全跳过glVertexPointer()和co。这将避免任何翻倍,并且也很好地统一。您仍然应该使用glGetAttribLocation(),因为AFAIK您无法提前知道每个属性在运行时将映射到哪个索引。

与往常一样,the extension spec拥有所有血腥的细节。