【问题标题】:Identify pixel data format in SDL识别 SDL 中的像素数据格式
【发布时间】:2016-04-08 15:32:25
【问题描述】:

在 OS X 上运行,我使用 SDL_Image 库在 OpenGL 中加载了纹理(使用返回 SDL_Surface*IMG_LOAD())。似乎颜色通道已被交换,即我必须将GL_BGRA 设置为glTexImage2D() 中的像素格式参数。

有没有一种方法可以确定正确的数据格式(BGRA 或 RGBA 等),而无需简单地编译和检查纹理? SDL 交换这些颜色通道的原因是什么?

【问题讨论】:

  • 我打算发布一个答案,但我意识到我错过了解决方案的很大一部分。基本上,对于许多系统上的无符号 8 位归一化纹理,BGRA 是首选,而其他类型则倾向于使用 RGBA。但是,我无法找到一种方法来询问 SDL_Image 它输出什么格式,这是确保它与您告诉 OpenGL 的内容相匹配的关键。但是,现在,您在任何合理的系统上加载的任何图像都可能会被 BGRA 订购。 HDR 文件可能会弹出 RGBA 或 ARGB。

标签: opengl colors textures sdl


【解决方案1】:

是的。以下链接包含如何确定每个组件的通道偏移的代码示例:http://wiki.libsdl.org/SDL_PixelFormat#Code_Examples

来自网站:

SDL_PixelFormat *fmt;
SDL_Surface *surface;
Uint32 temp, pixel;
Uint8 red, green, blue, alpha;
.
.
.
fmt = surface->format;
SDL_LockSurface(surface);
pixel = *((Uint32*)surface->pixels);
SDL_UnlockSurface(surface);

/* Get Red component */
temp = pixel & fmt->Rmask;  /* Isolate red component */
temp = temp >> fmt->Rshift; /* Shift it down to 8-bit */
temp = temp << fmt->Rloss;  /* Expand to a full 8-bit number */
red = (Uint8)temp;

您应该能够按值对 Xmask 进行排序。然后你可以确定它是RGBA还是BGRA。如果 Xmask == 0 则颜色通道不存在。

我不知道为什么会发生交换。

编辑:从 Xshift 更改为 Xmask,因为后者可用于确定颜色通道的位置和存在。

【讨论】:

  • “我不知道为什么会发生交换。” 字节顺序很可能。不知道这里涉及的是什么版本的 OS X,甚至不知道什么处理器架构,但这是该平台上比其他平台更常见的问题。
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2016-02-09
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
相关资源
最近更新 更多