[SDL] SDL_Surface -> OpenGL texture only works with RGBA?
Matthias Weigand
weigole at gmx.de
Fri Dec 7 07:06:39 PST 2007
Hi,
I think you have a problem with the GL_UNPACK_ALIGNMENT parameter of
glPixelStore. Your color data is tightly packed within memory. OpenGL
defaults to unpack image rows with a 4 byte alignment, which is given in
case of RGBA data.
Try to set the GL_UNPACK_ALIGNMENT to 1.
If this doesn't help, a more detailed description of the the observed
distortion would be helpful.
Matthias
Johannes Bauer schrieb:
> Hello list,
>
> I've recently updated a routine of mine which converts SDL_Surfaces to
> OpenGL Textures - so that it could also process RGB surfaces
> (previously, all of them where RGBA which is a waste when I don't need
> an alpha channel). However I noticed that surfaces which are RGB are all
> defective (distorted, looking like parts of unallocated memory are
> rendered) - the RGBA texture conversion works fine, however. Could you
> maybe take a look at my code? It should be pretty self-explanatory:
>
> Thank you in advance,
> Greetings,
> Johannes
>
> --------------- Code ------------------------------------
>
> GLuint Renderer::Convert_Texture(SDL_Surface *Image, bool Tileable, bool
> MipMaps, bool TextureFiltering) {
> EXCEPTIONASSERTION((Image->format->BytesPerPixel == 3) ||
> (Image->format->BytesPerPixel == 4), "Only RGB and RGBA surfaces are
> supported.");
>
> int Texture_Size = Image->w * Image->h * Image->format->BytesPerPixel;
> EXCEPTIONASSERTION(Texture_Size > 0, "Texture size <= 0");
>
> GLubyte *Data = new GLubyte[Texture_Size];
>
> // Traverse through surface and grab the pixels
> int Pos = 0;
> bool Alpha = (Image->format->BytesPerPixel == 4);
> for (int y = Image->h - 1; y >= 0; y--) {
> for (int x = 0; x < Image->w; x++) {
> Uint8 R, G, B, A;
>
> Uint32 Color = SDLOps::GetPixel(Image, x, y);
>
> if (!Alpha) {
> SDL_GetRGB(Color, Image->format, &R, &G, &B);
> } else {
> SDL_GetRGBA(Color, Image->format, &R, &G, &B, &A);
> }
>
> Data[Pos++] = R;
> Data[Pos++] = G;
> Data[Pos++] = B;
> if (Alpha) Data[Pos++] = A;
> }
> }
>
> GLuint Texture;
> int Texture_Type = Alpha ? GL_RGBA : GL_RGB;
> glGenTextures(1, &Texture); // Generate texture ID
> glBindTexture(GL_TEXTURE_2D, Texture);
>
> glTexImage2D(GL_TEXTURE_2D, 0, Texture_Type, Image->w, Image->h, 0,
> Texture_Type, GL_UNSIGNED_BYTE, Data);
> int Filter_Minify, Filter_Magnification;
> if (TextureFiltering) {
> Filter_Minify = MipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR;
> Filter_Magnification = GL_LINEAR;
> } else {
> Filter_Minify = MipMaps ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST;
> Filter_Magnification = GL_NEAREST;
> }
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, Filter_Minify);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
> Filter_Magnification);
>
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, Tileable ?
> GL_REPEAT : GL_CLAMP);
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, Tileable ?
> GL_REPEAT : GL_CLAMP);
> if (MipMaps) {
> gluBuild2DMipmaps(GL_TEXTURE_2D, Texture_Type, Image->w, Image->h,
> Texture_Type, GL_UNSIGNED_BYTE, Data);
> }
>
> delete[] Data;
> return Texture;
> }
>
>
>
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
>
More information about the SDL
mailing list