2009-11-12 2 views
3

J'essaie de charger un fichier image et de l'utiliser comme texture pour un cube. J'utilise SDL_image pour le faire.SDL_image/C++ Programme OpenGL: IMG_Load() produit des images floues

original image http://i33.tinypic.com/2i1f3bp.jpg

J'ai utilisé cette image parce que je l'ai trouvé dans divers formats de fichiers (tga, TIF, jpg, png, bmp)

Le code:

SDL_Surface * texture; 

//load an image to an SDL surface (i.e. a buffer) 

texture = IMG_Load("/Users/Foo/Code/xcode/test/lena.bmp"); 

if(texture == NULL){ 
    printf("bad image\n"); 
    exit(1); 
} 

//create an OpenGL texture object 
glGenTextures(1, &textureObjOpenGLlogo); 

//select the texture object you need 
glBindTexture(GL_TEXTURE_2D, textureObjOpenGLlogo); 

//define the parameters of that texture object 
//how the texture should wrap in s direction 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
//how the texture should wrap in t direction 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
//how the texture lookup should be interpolated when the face is smaller than the texture 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
//how the texture lookup should be interpolated when the face is bigger than the texture 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

//send the texture image to the graphic card 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture-> pixels); 

//clean the SDL surface 
SDL_FreeSurface(texture); 

Le code compile sans erreurs ni avertissements!

J'ai fatigué tous les formats de fichiers, mais cela produit toujours ce résultat laid:

result http://i34.tinypic.com/ipbpxe.jpg

J'utilise: SDL_image 1.2.9 & SDL 1.2.14 avec XCode 3.2 sous 10.6.2

Est-ce que quelqu'un sait comment résoudre ce problème?

+5

À noter: La raison pour laquelle vous trouvez cette image dans de nombreux formats est parce que c'est l'image standard pour les tests de compression d'image. "Lenna" est le nom de l'image et le nom du modèle est Lena Soderberg. L'histoire de l'image est assez intéressante. – greyfade

Répondre

10

La raison pour laquelle l'image est déformée est qu'elle n'est pas au format RGBA que vous avez spécifié. Vérifiez le texture->format pour trouver le format dans lequel il est et sélectionnez la constante GL_ appropriée qui représente le format. (Ou, le transformer vous-même au format de votre choix.)

+0

+1, battu moi –

2

Je pense que greyfade a la bonne réponse, mais une autre chose que vous devez savoir est la nécessité de verrouiller les surfaces. Ce n'est probablement pas le cas, car vous travaillez avec une surface en mémoire, mais vous devez normalement verrouiller les surfaces avant d'accéder à leurs données de pixel avec SDL_LockSurface(). Par exemple:

bool lock = SDL_MUSTLOCK(texture); 
if(lock) 
    SDL_LockSurface(texture); // should check that return value == 0 
// access pixel data, e.g. call glTexImage2D 
if(lock) 
    SDL_UnlockSUrface(texture); 
0

Si vous avez un alpha chanel chaque pixel est 4 octets non signés, si vous ne le faites pas, il est 3 octets non signés. Cette image n'a pas de transparence et quand j'essaie de la sauvegarder, c'est un .jpg.

changement

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, Texture-> w, Texture-> h, 0, GL_RGB, GL_UNSIGNED_BYTE, Texture-> pixels);

à

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

Cela devrait le réparer.

Pour une .png avec un canal alpha utilisation

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, Texture-> w, Texture-> h, 0, GL_RGBA, GL_UNSIGNED_BYTE, Texture-> pixels);

+0

c'est en fait faux. le paramètre que vous modifiez est utilisé pour indiquer à GL quel format utiliser pour _store_ la texture. stocker en RGBA lorsque votre entrée est RVB est parfaitement valide, il définit A = 1 pour tous les texels. – Bahbar

Questions connexes