从 sdl 调色板表面创建 OpenGL 纹理 (SDL_PIXELFORMAT_INDEX8)

Creating an OpenGL texture from sdl palette surface (SDL_PIXELFORMAT_INDEX8)

我创建了一个 bmp 并在检查生成的 SDL_Surface 时使用 SDL_LoadBMP 加载它我可以看到它的格式为 SDL_PIXELFORMAT_INDEX8.

我想使用 SDL 表面生成纹理,使用 glTexImage2D

通常我只能检查表面 接近于此的东西:

SDL_Surface * surface = SDL_LoadBMP(filename.c_str()); 
GLenum mode = 0;
Uint8 bpp = surface->format->BytesPerPixel;
Uint32 rm = surface->format->Rmask;
if (bpp == 3 && rm == 0x000000ff) mode = GL_RGB;
if (bpp == 3 && rm == 0x00ff0000) mode = GL_BGR;
if (bpp == 4 && rm == 0x000000ff) mode = GL_RGBA;
if (bpp == 4 && rm == 0xff000000) mode = GL_BGRA;

GLsizei width = surface->w;
GLsizei height = surface->h;
GLenum format = mode;
GLvoid * pixels = surface->pixels;

/*insert gl texture magic*/

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, pixels);

然而 SDL_PIXELFORMAT_INDEX8BytesPerPixel 为 1,所有掩码均为 0。从 SDL Code Examples 我读到: "A pixel format has either a palette or masks. If a palette is used Rmask, Gmask, Bmask, and Amask will be 0."

所以我假设我的数据有调色板而不是遮罩。

glTexImage2D表示它只接受GL_ALPHAGL_RGBGL_RGBAGL_LUMINANCEGL_LUMINANCE_ALPHA

我可以直接从任何表面创建纹理,即使它是基于调色板的吗? 有没有办法使用 SDL 将任何图像转换为 GL_RGBA? 我是否错过了更好的方法?

我能够转换成已知格式,因此它被 OpenGL 接受。

GLenum mode = GL_RGBA;
SDL_PixelFormat * target = SDL_AllocFormat(SDL_PIXELFORMAT_RGBA32);
SDL_Surface * surface = SDL_ConvertSurface(tmp, target, 0);
SDL_FreeSurface(tmp);
SDL_FreeFormat(target);