SDL_surface for OpenGL texture

Hey I have this script to load SDL_Surface and save it as OpenGL texture:

typedef GLuint texture;

texture load_texture(std::string fname){
    SDL_Surface *tex_surf = IMG_Load(fname.c_str());
    if(!tex_surf){
        return 0;
    }
    texture ret;
    glGenTextures(1, &ret);
    glBindTexture(GL_TEXTURE_2D, ret);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    SDL_FreeSurface(tex_surf);
    return ret;
}

      

The problem is, it doesn't work. When I call the function from the main function, it just doesn't load the image (when displaying it only the drawing color rotation), and when called from any function outside the main function, the program crashes. This is the line that causes the program to crash:

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

      

Can anyone see a bug in this?

0


source to share


4 answers


My bet is that you need to transform the SDL_Surface before trying to squeeze it into the OpenGL texture. Here's something that should give you a general idea:

SDL_Surface* originalSurface; // Load like an other SDL_Surface

int w = pow(2, ceil( log(originalSurface->w)/log(2) ) ); // Round up to the nearest power of two

SDL_Surface* newSurface = 
  SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0);
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface

texture ret;

glGenTextures( 1, &ret );
glBindTexture( GL_TEXTURE_2D, ret );
glTexImage2D( GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB,
          GL_UNSIGNED_BYTE, newSurface->pixels );

      



I found the original code here . There may be some other helpful posts on GameDev .

+2


source


I'm not sure if you are doing this somewhere outside of the code snippet, but you called

glEnable (GL_TEXTURE_2D);


at some point?

0


source


In addition, the GL_REPLACE texture blending mode will by default multiply the current glColor with the incoming RGB texel values. Corollary: glColor3f (0,0,0) will give you black where your texture should be :)

Make sure you are glColor3f (1,1,1) before drawing textured geometry.

0


source


The problem is probably the third argument ( internalformat

) of the call glTexImage2D

.

glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

      

You should use constants such as GL_RGB

or GL_RGBA

because the actual values โ€‹โ€‹of the macro are not related to the number of color components.

For a list of valid values, see the reference manual: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml .

This seems to be a common mistake. Maybe some drivers are just smart and fix this, so the wrong line might still work for some people.

/usr/include/GL/gl.h:473:#define GL_RGB             0x1907
/usr/include/GL/gl.h:474:#define GL_RGBA            0x1908

      

0


source







All Articles