Comment puis-je charger des textures OpenGL à l'aide de FreeImage bibliothèque?
Je suis en train d'apprendre OpenGL en C++ à l'aide de NeHe tutoriels, mais je vais essayer de le faire avec FreeImage de la bibliothèque, au lieu de Glaux ou le SOL. Le point positif que je vois dans l'aide de FreeImage est thar c'est la dernière mise à jour a eu lieu en octobre de l'année dernière, tandis que le SOL n'a pas été mis à jour à 5 ans. Le problème que j'ai c'est que je ne suis pas en mesure de charger les textures correctement.
Voici mon code:
static GLuint texture = 0;
if (texture == 0)
{
FIBITMAP* bitmap = FreeImage_Load(
FreeImage_GetFileType("textures/test/nehe_06.png", 0),
"textures/test/nehe_06.png");
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(bitmap), FreeImage_GetHeight(bitmap),
0, GL_RGB, GL_UNSIGNED_BYTE, FreeImage_ConvertTo32Bits(bitmap));
FreeImage_Unload(bitmap);
}
L'aide de ce code, la texture que je reçois est mauvais: il est noir, avec des points de couleur et des bandes, et la modification de l'image donne le même résultat, donc je suppose que je ne suis pas le chargement de la texture correctement.
J'ai essayé d'intervertir les rouge et bleu bits (lire que FreeImage charges BGR) avec pas de meilleur résultat. Enfin, si je change l' *FreeImage_ConvertTo32Bits(bitmap)* par *FreeImage_GetBits(bitmap)* j'obtiens une erreur de segmentation.
Ce que je fais mal?
OriginalL'auteur Razican | 2013-06-15
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes avec votre code un est que vous convertissez à l'image de 32 bits, mais vous spécifiez un 24 bits format de texture openGL (
GL_RGB
). La deuxième, c'est que vous êtes de passage à la FreeImage objet lui-même à la texture plutôt que de le convertir en bits.Vous avez besoin de faire quelque chose comme ceci à la place
Avec 32 bits pixels, tous les scanlines sont les tailles de 4 octets aligné de toute façon. Dans quelles situations avez-vous pense que ça ne marchera pas?
OriginalL'auteur Roger Rowland
Pour étendre la réponse précédente:
FreeImage_GetBits()
fonction retourne un pointeur vers les données stockées dans un FreeImage-format interne. Où chaque scanline est généralement alignée à 4 octets limite. Cela fonctionne bien alors que vous avez une puissance de deux textures. Cependant, pour NPOT de textures, vous devrez indiquer le bon déballage de l'alignement pour l'OpenGL.Il existe une autre fonction dans FreeImage qui vous permettra d'obtenir des non alignés serrées tableau de pixels:
FreeImage_ConvertToRawBits()
OriginalL'auteur Sergey K.