识别SDL中的像素数据格式

时间:2016-04-06 23:47:08

标签: opengl colors textures sdl

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

有没有办法确定正确的数据格式(BGRA或RGBA等),而不仅仅是编译和检查纹理? SDL交换这些颜色通道的原因是什么?

1 个答案:

答案 0 :(得分: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;

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

我不知道交换发生的原因。

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