在 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
).
我有一个理论问题:为什么不在 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
).