1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
GLuint loadTexturee(const string& fileName){
GLuint texture;
SDL_Surface *surface;
GLenum texture_format = GL_RGB;
GLint nOfColors;
if((surface = SDL_LoadBMP(fileName.c_str()))){
//Check that the image's width is a power of 2
if((surface->w & (surface->w - 1)) != 0) cout << "warning: image.bmp's width is not a power of 2\n";
//Also check if the height is a power of 2
if((surface->h & (surface->h - 1)) != 0) cout << "warning: image.bmp's height is not a power of 2\n";
//Get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if(nOfColors == 4){ //Contains an alpha channel
if(surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA;
}else if(nOfColors == 3){ //No alpha channel
if(surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR;
}else{
cout << "warning: the image is not truecolor.. this will probably break\n";
//This error should not go unhandled
}
//Have OpenGL generate a texture object handle for us
glGenTextures(1, &texture);
//Bind the texture object
glBindTexture(GL_TEXTURE_2D, texture);
//Set the texture's stretching properties
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0, texture_format, GL_UNSIGNED_BYTE, surface->pixels);
if(surface) SDL_FreeSurface(surface);
return texture;
}else{
cout << "SDL could not load image.bmp: " << SDL_GetError() << endl;
if(surface) SDL_FreeSurface(surface);
//SDL_Quit();
//return 1;
}
return -1;
}
|