从 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_INDEX8
的 BytesPerPixel
为 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_ALPHA
、GL_RGB
、GL_RGBA
、GL_LUMINANCE
和GL_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);
我创建了一个 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
的 BytesPerPixel
为 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_ALPHA
、GL_RGB
、GL_RGBA
、GL_LUMINANCE
和GL_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);