我给glTexSubImage2D打电话。如果我的像素格式是GL_RGBA
,那么像素类型GL_UNSIGNED_BYTE
和GL_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规范,但老实说,我无法理解它们。
发布于 2011-10-16 18:33:40
答案是否定和否定。您必须考虑计算机中的字节顺序。如果有GL_RGBA
和GL_UNSIGNED_INT_8_8_8_8
,这意味着像素存储在32位整数中,颜色以这样一个整数的逻辑顺序RGBA表示,例如红色在高阶字节中,alpha在低阶字节中。但是,如果机器是小端(与Intel CPU一样),那么内存中的实际顺序是ABGR。然而,GL_RGBA
和GL_UNSIGNED_BYTE
将以RGBA顺序存储字节,而不管计算机是端字节还是大端字节。
带有GL_BGRA
的GL_UNSIGNED_INT_8_8_8_8_REV
将以逻辑顺序ARGB将颜色存储在整数中,但是在一台小终端机器上,您可以在内存中获得BGRA顺序。
发布于 2021-12-07 13:03:24
先看JWWalker's answer。这个答案是对它的补充。一个简单的例子。
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,但是在一台小型endian机器(这是正常的体系结构)上,0xrrggbbaa
首先存储了一个小字节(最小有效)。如果您一次只读取一个字节的uint32_t
,您将首先得到0xaa
!一个C++示例:
uint32_t color{0x11223344};
uint8_t first_byte{reinterpret_cast<uint8_t*>(color)[0]};
first_byte
将等于0x44
。
让人困惑的是“第一”这个词。它可以表示“写入时首先出现”,如“红色字节在0xrrggbbaa中第一”。这与“具有最低的内存/指针地址”是不同的,比如“当使用小endian编码时,alpha字节在0xrrggbbaa中是第一位的”!当您使用GL_RGBA
时,它看起来肯定是第一个红色的,但是当用一个4字节的整数小endian编码时,它在十六进制表示中只是这样。
https://stackoverflow.com/questions/7786187
复制相似问题