在OS X上运行,我使用SDL_Image
库(使用IMG_LOAD()
返回SDL_Surface*
)在OpenGL中加载了一个纹理。看来颜色通道已被交换,即我必须将GL_BGRA
设置为glTexImage2D()
中的像素格式参数。
有没有办法确定正确的数据格式(BGRA或RGBA等),而不仅仅是编译和检查纹理? SDL交换这些颜色通道的原因是什么?
答案 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,因为后者可用于确定颜色通道的位置和存在。