OpenGL纹理上传:UNSIGNED_BYTE vs UNSIGNED_INT_8_8_8_8

Ste*_*nov 10 opengl pixelformat

我正在调用glTexSubImage2D.如果我的像素格式是GL_RGBA,那么像素类型GL_UNSIGNED_BYTEGL_UNSIGNED_INT_8_8_8_8完全相同吗?

另外,这两对是否相同?

  • Format = GL_RGBA, Type = GL_UNSIGNED_INT_8_8_8_8
  • Format = GL_BGRA, Type = GL_UNSIGNED_INT_8_8_8_8_REV

我已经尝试过阅读OpenGL规范和GL_EXT_packed_pixels规范,但说实话,我无法做出它们的头或尾.

JWW*_*ker 21

答案是否和否.您必须考虑计算机中的字节顺序.如果你有GL_RGBAGL_UNSIGNED_INT_8_8_8_8,这意味着像素以32位整数存储,并且颜色在逻辑顺序RGBA中是这样的整数,例如,红色在高位字节中,而alpha在低位字节.但如果机器是little-endian(与Intel CPU一样),那么内存中的实际顺序是ABGR.然而,GL_RGBAwith GL_UNSIGNED_BYTE将以RGBA顺序存储字节,无论计算机是小端还是大端.

GL_BGRAwith GL_UNSIGNED_INT_8_8_8_8_REV将以逻辑顺序ARGB存储整数颜色,但是在小端机器上,您将获得内存中的BGRA顺序.

  • 值得指出的是,此示例中的"GL_UNSIGNED_BYTE"和"GL_UNSIGNED_INT _..."是像素传输类型.他们没有说明GL如何存储颜色,只是在发送颜色数据时GL如何解释"打包"颜色.这是一个重要的区别,因为通常这些更奇特的格式的目标是匹配客户端(CPU)和服务器(GPU)格式,以便GL不需要执行数据转换并且可以进行简单的块传输. (3认同)