12

我打电话给 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 规范,但老实说,我无法确定它们的头或尾。

4

2 回答 2

26

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

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

于 2011-10-16T18:33:40.923 回答
0

首先查看JWWalker 的答案。这个答案是对它的补充。一个快速的例子。

GL_RGBA存储在GL_UNSIGNED_INT_8_8_8_8

0xrrggbbaa

GL_RGBA' stored in GL_UNSIGNED_BYTE`:

[0xrr, 0xgg, 0xbb, 0xaa]

在这两种情况下,RGBA 的逻辑顺序都是 r、g、b、a,但在小端机器(这是正常架构)0xrrggbbaa上,首先存储小字节(最低有效位)。如果您一次读取uint32_t一个字节,您将获得0xaa第一个!一个 C++ 示例:

uint32_t color{0x11223344};
uint8_t first_byte{reinterpret_cast<uint8_t*>(color)[0]};

first_byte将等于0x44

令人困惑的是“第一”这个词。它可以表示“写入时首先出现”,如“红色字节在 0xrrggbbaa 中首先出现”。这与“具有最低内存/指针地址”不同,如“使用 little-endian 编码时 alpha 字节在 0xrrggbbaa 中的第一个”!当您使用GL_RGBA时,它肯定看起来像红色将是第一个,但是当以 4 字节整数小端编码时,它只是在十六进制表示中的方式。

于 2021-12-07T13:03:24.267 回答