4

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

此外 (...)、GL_INT_2_10_10_10_REVGL_UNSIGNED_INT_2_10_10_10_REV被接受glVertexAttribPointer

_REV后缀在这里是什么意思?

4

1 回答 1

4

部分解释见:http ://www.informit.com/articles/article.aspx?p=2033340&seqNum=3 Section Packed Data

顶点属性的打包数据格式

回到 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、a 时使用颜色约定。在图 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 位)。这可以节省内存空间和带宽,从而有助于提高性能。

希望有帮助。

于 2013-07-18T14:50:54.977 回答