Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 14 Dec 2008, 10:46 Message non corrigé | |
|
Ai vous moquez pas hein, c'est déjà bien que j'en soit arrivé là.
Alors si quelqu'un peu m'expliquer le bug...
De plus je comprend pas très bien GL_MAG_FILTER et GL_MIN_FILTER.
Si je les mets pas, il m'affiche rien, et si je les mets, il m'affiche ceci :
http://www.jeux-libres.com/membres/mes_images/445_1229247571_essaytextureresultat.jpg
Perso moi je trouves que c'est déjà pas mal.
Mais si ça pouvait me l'afficher correctement se serait encore meiux.
Alors bah j'ai utiliser donc la même manière que David, en regardant un tuto bien expliqué sur les fichiers bmp.
Mais je pense pas que l'erreur se trouves dans ces deux fichiers.
chargerImage.h
#ifndef CHARGERBMP_H_INCLUDED
#define CHARGERBMP_H_INCLUDED
#include <iostream>
#include <fstream>
struct rgba {
char r;
char g;
char b;
char a;
};
class Image
{
private :
int width;
int height;
rgba* texture;
const char* nomFichier;
public :
rgba* chargerBMP (const char* nomFichier);
Image (const char* nomFichier);
int getWidth () const;
int getHeight () const;
rgba* getRGBA () const;
~Image();
};
#endif // CHARGERBMP_H_INCLUDED
Et le fichier .cpp
#include "chargerImage.h"
#include "stdlib.h"
using namespace std;
Image::Image (const char* nomFichier) : nomFichier(nomFichier) {
texture = chargerBMP(nomFichier);
}
rgba* Image::chargerBMP (const char* nomFichier) {
cout<< "Chargement de l'image " << nomFichier << endl;
ifstream fichierBMP (nomFichier, ios::in, ios::binary);
if (!fichierBMP)
return 0;
char format[2];
fichierBMP.read (format, 2 * sizeof (char));
if(format[0] != 'B' || format[1] != 'M')
return 0;
// On se positionne au niveau de l'information sur l'offset
fichierBMP.seekg(10, ios::beg);
// On récupère l'offset
unsigned long offset = 0;
fichierBMP.read ((char*) &offset, sizeof(int));
// On récupère la largeur et le hauteur
unsigned long largeur;
unsigned long hauteur;
fichierBMP.seekg(18, ios::beg);
fichierBMP.read((char*) &largeur, sizeof(int));
fichierBMP.read ((char*) &hauteur, sizeof(int));
width = largeur;
height = hauteur;
// On récupère le nombre de bits par pixel
unsigned short bitsParPixel;
fichierBMP.seekg(28, ios::beg);
fichierBMP.read ((char*) &bitsParPixel, sizeof(short));
// S'il ne s'agit pas d'un BMP de 24 bits/px -> erreur
if(bitsParPixel != 24)
return 0;
// On se déplace au debut de l'image
fichierBMP.seekg(offset, ios::beg);
int nbPixels = largeur * hauteur;
cout<<nbPixels;
// Puis on récupère la totalité de l'image
texture = (new rgba[nbPixels * sizeof(rgba)]);
int i;
for (i = nbPixels; i >=0; i--)
{
// Attention BMP est en BGR et non RGB !!
fichierBMP.read ((char*) &texture[i].b, sizeof (char));
fichierBMP.read ((char*) &texture[i].g, sizeof (char));
fichierBMP.read ((char*) &texture[i].r, sizeof (char));
texture[i].a = 0;
}
/* int positionCourante = 1;
int positionFinale = largeur - 1;
int i;
for (i = nbPixels - largeur; i != positionFinale; i++)
{
// Attention BMP est en BGR et non RGB !!
fichierBMP.read ((char*) &texture[i].b, sizeof(char));
fichierBMP.read ((char*) &texture[i].g, sizeof(char));
fichierBMP.read ((char*) &texture[i].r, sizeof(char));
texture[i].a = 0;
if(positionCourante == largeur)
{
i -= (2 * largeur);
positionCourante = 1;
}
else
positionCourante++;
}*/
fichierBMP.close();
cout << "Image BMP Chargee !\n";
return texture;
}
int Image::getWidth () const {
return width;
}
int Image::getHeight () const {
return height;
}
rgba* Image::getRGBA () const {
return texture;
}
Image::~Image ()
{
delete[] texture;
}
et le main.cpp
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>
#include "chargerImage.h"
int nWindowID;
const int largeur = 640;
const int hauteur = 490;
void afficher ();
void attendre ();
void clavier (unsigned char touche, int x, int y);
void init ();
GLuint chargerTexture (Image* image);
GLuint textureId;
int main (int argc, char *argv[]) {
//Initialisation de glut.
glutInit (&argc, argv);
//Paramètrage de l'affichage.
glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
//Dimensionner la fenêtre.
glutInitWindowSize (largeur, hauteur);
//Création de la fenêtre.
nWindowID = glutCreateWindow ("Ma première fenêtre window.");
init ();
//Reférencement de la fonction d'affichage.
glutDisplayFunc (afficher);
//Référencement de la fonction d'attente.
glutIdleFunc(attendre);
//Référencement à la fonction qui gère les évènements.
glutKeyboardFunc(clavier);
// boucle de gestion des evenements.
glutMainLoop();
// le programme n'arrivera jamais jusqu'ici
return EXIT_SUCCESS;
}
void init () {
glEnable (GL_DEPTH_TEST);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_COLOR_MATERIAL);
glMatrixMode (GL_PROJECTION);
glEnable(GL_TEXTURE_2D);
glLoadIdentity ();
gluPerspective (45.0f, (float) (largeur/hauteur), 1.0, 200);
gluLookAt(-5, 20, -10, 0, 0, 0, 0, 1, 0);
Image *image = new Image ("sol_metal.bmp");
textureId = chargerTexture (image);
delete image;
}
//Fonction appelée pour l'affichage.
void afficher () {
//Effacement de l'écran et du tampon de profondeur.
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
GLfloat ambientColor[] = {255, 255, 255, 100};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);
GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat lightPos[] = {-10, 10, -10, 0};
glLightfv (GL_LIGHT0, GL_DIFFUSE, lightColor);
glLightfv (GL_LIGHT0, GL_POSITION, lightPos);
glBindTexture (GL_TEXTURE_2D, textureId);
glBegin (GL_QUADS);
//Sol.
glColor3f (1.0f, 1.0f, 1.0f);
glTexCoord2f (0.0f, 0.0f);
glVertex3d (-100, 0, -100);
glTexCoord2f (20.0f, 0);
glVertex3d (100, 0, -100);
glTexCoord2f (20.0f, 20.0f);
glVertex3d (100, 0, 100);
glTexCoord2f (0, 20.0f);
glVertex3d (-100, 0, 100);
//Face1.
glColor3ub(255, 0, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 5, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 0, 0);
//Face 2.
glColor3ub(0, 255, 0);
glVertex3f (5, 0, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 5, 5);
glVertex3f (5, 0, 5);
//Face 3.
glColor3ub (255, 255, 0);
glVertex3f (0, 0, 5);
glVertex3f (0, 5, 5);
glVertex3f (5, 5, 5);
glVertex3f (5, 0, 5);
//Face 4.
glColor3ub (255, 0, 255);
glVertex3f (0, 0, 5);
glVertex3f (0, 5, 5);
glVertex3f (0, 5, 0);
glVertex3f (0, 0, 0);
//Face5.
glColor3ub (255, 255, 0);
glVertex3f (0, 0, 0);
glVertex3f (5, 0, 0);
glVertex3f (5, 0, 5);
glVertex3f (0, 0, 5);
//Face6.
glColor3ub (0, 255, 255);
glVertex3f (0, 5, 0);
glVertex3f (5, 5, 0);
glVertex3f (5, 5, 5);
glVertex3f (0, 5, 5);
glEnd ();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//Echange les buffers "front" et ""back".
glFlush ();
glutSwapBuffers ();
}
void attendre () {
//Mémorise le temps à attendre.
static int nAttendreJusque = glutGet (GLUT_ELAPSED_TIME);
//Récupérer le moment présent.
int nTimer = glutGet (GLUT_ELAPSED_TIME);
//On compare l'instant qu'il faut attendre avec le moment présent.
if (nTimer >= nAttendreJusque) {
//Rafraichis l'affichage.
glutPostRedisplay ();
nAttendreJusque = nTimer + (1000 / 5);
}
}
// fonction de gestion du clavier
void clavier(unsigned char touche, int x, int y)
{
// traitement des touches q et echap
if(touche=='q' || touche == 27)
{
// destruction de la fenetre GLUT
glutDestroyWindow(nWindowID);
// on quitte notre programme
exit(EXIT_SUCCESS);
}
}
GLuint chargerTexture (Image* image) {
GLuint nom;
glGenTextures (1, &nom);
glBindTexture (GL_TEXTURE_2D, nom);
glTexImage2D (GL_TEXTURE_2D, 0, 4, image->getWidth(), image->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image->getRGBA());
return nom;
}
Alors je vois pas l'erreur, et ça m'énerve parce que j'aimerais en finir avec ça pour passer au chargement de l'ogre.
Sinon, si quelqu'un à un tuto qui explique les formats de fichiers .jpg et .png, ça m'intéresse.
Wai bon en C ça marche donc c'est surement en lisant mes valeurs rgb avec read mais je vois pas ou est le problème.
C'est bien un octet bleu, un autre vert et un rouge ?
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 14 Dec 2008, 14:46 Message non corrigé | |
|
Réussi!
Mais j'ai du utiliser l'ancienne librairie du C pour lire mon fichier de texture car avec fstream ça ne marche pas.
Si quelqu'un sait pourquoi.
Donc quand je met ça par contre ça marche :
rgba* Image::chargerBMP (const char* nomFichier) {
cout<<"Chargement de l'image : "<<nomFichier<<endl;
FILE* fichierBMP = fopen(nomFichier, "rb");
if (! fichierBMP)
return 0;
char format[2];
if(fread (format, sizeof(char), 2, fichierBMP) != 2)
return 0;
if(format[0] != 'B' || format[1] != 'M')
return 0;
// On se positionne au niveau de l'information sur l'offset
fseek(fichierBMP, 10, SEEK_SET);
// On récupère l'offset
unsigned long offset = 0;
if (fread (&offset, sizeof(long), 1, fichierBMP) != 1)
return 0;
// On récupère la largeur et le hauteur
fseek(fichierBMP, 18, SEEK_SET);
if (fread (&width, sizeof(int), 1, fichierBMP) != 1
|| fread (&height, sizeof(int), 1, fichierBMP) != 1)
return 0;
// On récupère le nombre de bits par pixel
unsigned short bitsParPixel;
fseek(fichierBMP, 28, SEEK_SET);
if (fread (&bitsParPixel, sizeof(short), 1, fichierBMP) != 1)
return 0;
// S'il ne s'agit pas d'un BMP de 24 bits/px -> erreur
if(bitsParPixel != 24)
return 0;
// On se déplace au debut de l'image
fseek(fichierBMP, offset, SEEK_SET);
int nbPixels = width * height;
// Puis on récupère la totalité de l'image
rgba* texture = new rgba[nbPixels * sizeof(struct rgba)];
int i;
for (i = 0; i < nbPixels; i++)
{
// Attention BMP est en BGR et non RGB !!
if (fread (&texture[i].b, 1, 1, fichierBMP) != 1)
return 0;
if (fread (&texture[i].g, 1, 1, fichierBMP) != 1)
return 0;
if (fread (&texture[i].r, 1, 1, fichierBMP) != 1)
return 0;
texture[i].a = 0;
}
/*
int positionCourante = 1;
int positionFinale = largeur - 1;
int i;
for (i = nbPixels - largeur; i != positionFinale; i++)
{
// Attention BMP est en BGR et non RGB !!
if (fread (&texture[i].b, 1, 1, fichierBMP) != 1)
return 0;
if (fread (&texture[i].g, 1, 1, fichierBMP) != 1)
return 0;
if (fread (&texture[i].r, 1, 1, fichierBMP) != 1)
return 0;
texture[i].a = 0;
if(positionCourante == largeur)
{
i -= (2 * largeur);
positionCourante = 1;
}
else
positionCourante++;
}*/
fclose(fichierBMP);
cout<<"Image BMP Chargee !\n"<<endl;
return texture;
}
...Bizarre...
Et ça me donne :
http://www.jeux-libres.com/membres/mes_images/445_1229262238_sol.jpg
Par contre j'ai pas trouvé de tutos ou ils expliquent les formats compressés.
Aller, je passe au chargement de modèles md2.
Et après les animations, me restera plus qu'à lire le tutos de oSasuke sur Newton.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|