阅读glVertexAttribPointer的 OpenGL 参考手册,我发现它接受一个非常奇怪的type值(实际上是其中两个):
另外(...),GL_INT_2_10_10_10_REV和GL_UNSIGNED_INT_2_10_10_10_REV被接受
glVertexAttribPointer
_REV这里的后缀是什么意思?
小智 5
部分解释位于:http://www.informit.com/articles/article.aspx ?p=2033340&seqNum=3 ?p=2033340&seqNum=3 \nSection Packed Data
\n\n\n\n\n顶点属性的打包数据格式
\n\n回到 glVertexAttribPointer() 命令,您会注意到大小参数的允许值为 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 令牌表示四分量数据,前三个分量分别表示为 10 位,最后一个分量表示为 2 位,以相反的顺序打包到单个 32 位数量(GLuint)中。GL_BGRA 可以很容易地被称为 GL_ZYXW.5 查看 32 位字内的数据布局,您会看到如图 3.3 所示的位划分。
\n\n图3.3:
\n\n\n\n
在图 3.3 中,顶点的元素按照 w、x、y、z\xe2\x80\x94 的顺序打包成单个 32 位整数,反转后为 z、y、x、w 或 b、g, r, a 当使用颜色约定时。在图 3.4 中,坐标按 w、z、y、x 的顺序排列,颠倒过来,用颜色约定写成 r、g、b、a。
\n\n图3.4\n
\n\n图 3.4。RGBA 打包顶点属性中的元素打包
\n\n顶点数据只能通过使用 GL_INT_2_10_10_10_REV 或 GL_UNSIGNED_INT_2_10_10_10_REV 标记以这两种格式中的第一种指定。当这些标记之一用作 glVertexAttribPointer() 的类型参数时,每个顶点都会消耗顶点数组中的一个 32 位字。该单词被解包到其组件中,然后可选地进行标准化(取决于加载到适当的顶点属性之前标准化参数的值)。这种数据排列特别适合法线或其他类型的属性,这些属性可以从额外的精度中受益由 10 位组件提供,但也许不需要半浮点数据提供的完整精度(每个组件需要 16 位)。这可以节省内存空间和带宽,从而有助于改进表现。
\n
希望有帮助。
\n