识别 SDL 中的像素数据格式
Identify pixel data format in SDL
运行 在 OS X 上,我使用 SDL_Image
库在 OpenGL 中加载了纹理(使用 IMG_LOAD()
其中 returns SDL_Surface*
).看来颜色通道已被交换,即我必须将 GL_BGRA
设置为 glTexImage2D()
.
中的像素格式参数
有没有一种方法可以确定正确的数据格式(BGRA 或 RGBA 等...)而无需简单地编译和检查纹理? SDL 交换这些颜色通道的原因是什么?
是的。以下 link 包含如何确定每个组件的通道偏移的代码示例: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;
您应该能够按价值对圣诞面具进行排序。然后你可以确定它是 RGBA 还是 BGRA。如果 Xmask == 0 则颜色通道不存在。
我不知道为什么会发生交换。
编辑:从 Xshift 更改为 Xmask,因为后者可用于确定颜色通道的位置和存在。
运行 在 OS X 上,我使用 SDL_Image
库在 OpenGL 中加载了纹理(使用 IMG_LOAD()
其中 returns SDL_Surface*
).看来颜色通道已被交换,即我必须将 GL_BGRA
设置为 glTexImage2D()
.
有没有一种方法可以确定正确的数据格式(BGRA 或 RGBA 等...)而无需简单地编译和检查纹理? SDL 交换这些颜色通道的原因是什么?
是的。以下 link 包含如何确定每个组件的通道偏移的代码示例: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;
您应该能够按价值对圣诞面具进行排序。然后你可以确定它是 RGBA 还是 BGRA。如果 Xmask == 0 则颜色通道不存在。
我不知道为什么会发生交换。
编辑:从 Xshift 更改为 Xmask,因为后者可用于确定颜色通道的位置和存在。