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

时间:2017-10-03 14:48:49

标签: c++ opengl textures sdl-2

我创建了一个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_INDEX8的{​​{1}}为1且所有蒙版均为0.从SDL Code Examples我读到:"像素格式有调色板或蒙版。如果使用调色板,则Rmask,Gmask,Bmask和Amask将为0。"

所以我假设我的数据有一个调色板而不是面具。

glTexImage2D表示它只接受BytesPerPixelGL_ALPHAGL_RGBGL_RGBAGL_LUMINANCE

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

1 个答案:

答案 0 :(得分:4)

我能够转换为已知格式,因此它被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);