_REV后缀在OpenGL中意味着什么?

时间:2013-07-18 14:44:27

标签: opengl

阅读glVertexAttribPointer的OpenGL参考手册我发现它接受了一个非常奇怪的type值(实际上是其中两个):

  

另外(...), GL_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV glVertexAttribPointer

接受

_REV后缀在这里意味着什么?

1 个答案:

答案 0 :(得分:4)

部分解释见于:http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3 部分打包数据

  

顶点属性的打包数据格式

     

回到glVertexAttribPointer()命令,您会注意到size参数的允许值是1,2,3,4和特殊标记GL_BGRA。此外,类型参数可以采用特殊值GL_INT_2_10_10_10_REV或GL_UNSIGNED_INT_2_10_10_10_REV之一,两者都对应于GLuint数据类型。这些特殊标记用于表示OpenGL可以使用的打包数据。 GL_INT_2_10_10_10_REV和GL_UNSIGNED_INT_2_10_10_10_REV令牌表示四个分量数据,表示前三个分量中的每一个的十位,最后两个,以相反的顺序打包成单个32位数量(一个GLuint)。可以很容易地将GL_BGRA称为GL_ZYXW.5。查看32位字内的数据布局,您会看到这些位被分割,如图3.3所示。

     

图3.3:

     

enter image description here

     

在图3.3中,顶点的元素按w,x,y,z的顺序打包成一个32位整数 - 当反转时是z,y,x,w或b,g,r ,使用颜色约定时。在图3.4中,坐标按w,z,y,x的顺序打包,其反转和用颜色约定写成r,g,b,a。

     

图3.4   enter image description here

     

图3.4。在RGBA打包的顶点属性中打包元素

     

可以使用GL_INT_2_10_10_10_REV或GL_UNSIGNED_INT_2_10_10_10_REV标记仅在这两种格式中的第一种格式中指定顶点数据。当其中一个标记用作glVertexAttribPointer()的类型参数时,每个顶点在顶点数组中消耗一个32位字。该单词被解压缩到其组件中,然后可选地进行归一化(在加载到适当的顶点属性之前,取决于normalize参数的值。这种数据排列特别适合于法线或其他类型的属性,可以从额外的精度中受益由10位组件提供,但可能不需要半浮点数据提供的全精度(每个组件需要16位)。这样可以节省内存空间和带宽,从而有助于提高性能。

希望有所帮助。