阅读glVertexAttribPointer的OpenGL参考手册我发现它接受了一个非常奇怪的type
值(实际上是其中两个):
另外(...), GL_INT_2_10_10_10_REV , GL_UNSIGNED_INT_2_10_10_10_REV 被
接受glVertexAttribPointer
_REV
后缀在这里意味着什么?
答案 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:
在图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
图3.4。在RGBA打包的顶点属性中打包元素
可以使用GL_INT_2_10_10_10_REV或GL_UNSIGNED_INT_2_10_10_10_REV标记仅在这两种格式中的第一种格式中指定顶点数据。当其中一个标记用作glVertexAttribPointer()的类型参数时,每个顶点在顶点数组中消耗一个32位字。该单词被解压缩到其组件中,然后可选地进行归一化(在加载到适当的顶点属性之前,取决于normalize参数的值。这种数据排列特别适合于法线或其他类型的属性,可以从额外的精度中受益由10位组件提供,但可能不需要半浮点数据提供的全精度(每个组件需要16位)。这样可以节省内存空间和带宽,从而有助于提高性能。
希望有所帮助。