在 OpenGL 中使用十六进制颜色

Use of Hexadecimal colours in OpenGL

我有一个理论问题:为什么不在 OpenGL 数组缓冲区中使用标准的 RGBA 颜色模型,为什么不只切掉每个顶点的 12 个额外字节并将其替换为 1 个包含十六进制格式颜色的整数?然后在着色器中,您可以将其转换回 vec4。

所以我的意思是,替换为:

glVertexAttribPointer(COL_INDEX, 4, GL_FLOAT, false, stride, offset);

为此:

glVertexAttribPointer(COL_INDEX, 1, GL_INT, false, stride, offset);

我试着在网上到处找,但没有找到任何相关信息。另外,保存这 12 个字节是否有任何性能优势?谢谢你的时间。

首先,使用4*4作为glVertexAttribPointer的大小参数是无效的。有效大小为 1 到 4,而 4 正是您在这里想要的,因为您需要 4 个通道来编码 RGBA 向量。

第二个版本不是很有用。如果我们同样忽略伪造的1*4,只使用一个通道,原则上是可以的,但是glVertexAttribPointer不能用来设置整型属性。这将做的是在着色器中设置一个 float 属性,而缓冲区的数据格式是 GL_INT。你会在这里失去一些精度,因为你不能将所有 2^32 整数值完全表示为 32 位浮点数,这将完全搞砸结果。

您可以使用 glVertexAttribIPointer(注意中间的 I)来设置 int 属性。

不过,您不需要这么复杂的操作。您只需要

glVertexAttribPointer(COL_INDEX, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, offset)

使用 4 个单独的字节作为 vec4 属性,当在着色器中访问时自动归一化到 [0,1] 范围(这是设置 normalize 参数的目的此函数为 GL_TRUE).