我创建了一个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
表示它只接受BytesPerPixel
,GL_ALPHA
,GL_RGB
,GL_RGBA
和GL_LUMINANCE
。
我可以直接从任何表面创建纹理,即使它是基于调色板吗?
有没有办法使用SDL将任何图像转换为GL_LUMINANCE_ALPHA
?
我错过了一个更好的方法吗?
答案 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);