首先查看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 字节整数小端编码时,它只是在十六进制表示中的方式。