首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL纹理上传: UNSIGNED_BYTE与UNSIGNED_INT_8_8_8_8

OpenGL纹理上传: UNSIGNED_BYTE与UNSIGNED_INT_8_8_8_8
EN

Stack Overflow用户
提问于 2011-10-16 17:58:15
回答 2查看 8.2K关注 0票数 13

我给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规范,但老实说,我无法理解它们。

EN

回答 2

Stack Overflow用户

发布于 2011-10-16 18:33:40

答案是否定和否定。您必须考虑计算机中的字节顺序。如果有GL_RGBAGL_UNSIGNED_INT_8_8_8_8,这意味着像素存储在32位整数中,颜色以这样一个整数的逻辑顺序RGBA表示,例如红色在高阶字节中,alpha在低阶字节中。但是,如果机器是小端(与Intel CPU一样),那么内存中的实际顺序是ABGR。然而,GL_RGBAGL_UNSIGNED_BYTE将以RGBA顺序存储字节,而不管计算机是端字节还是大端字节。

带有GL_BGRAGL_UNSIGNED_INT_8_8_8_8_REV将以逻辑顺序ARGB将颜色存储在整数中,但是在一台小终端机器上,您可以在内存中获得BGRA顺序。

票数 26
EN

Stack Overflow用户

发布于 2021-12-07 13:03:24

先看JWWalker's answer。这个答案是对它的补充。一个简单的例子。

GL_RGBA存储在GL_UNSIGNED_INT_8_8_8_8

代码语言:javascript
运行
复制
0xrrggbbaa

GL_RGBA' stored in GL_UNSIGNED_BYTE`:

代码语言:javascript
运行
复制
[0xrr, 0xgg, 0xbb, 0xaa]

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

代码语言:javascript
运行
复制
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编码时,它在十六进制表示中只是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7786187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档