[OpenGL] Probleme avec le rouge ... [resolu]

Probleme avec le rouge ... [resolu] [OpenGL] - Divers - Programmation

Marsh Posté le 04-01-2005 à 11:32:23    

Voila j'ai un probleme dés que j'autorise la fonction  LoadGLTextures() a etre executé dans InitGL() la couleur blanche est remplacée par la couleur rouge et ceci non seulement au endroits texturé mais dans toute la scene, y'a t'il un moyen de "reguler" les rvb de toute la scene ???
 

Code :
  1. ///////////////////////////////////////////////////////////////////////////////////////////////
  2. /* Image type - contains height, width, and data */
  3. struct Image {
  4.     unsigned long sizeX;
  5.     unsigned long sizeY;
  6.     char *data;
  7. };
  8. typedef struct Image Image;
  9. /* storage for one texture  */
  10. int texture[1];
  11. int ImageLoad(char *filename, Image *image) {
  12.     FILE *file;
  13.     unsigned long size;                 // size of the image in bytes.
  14.     unsigned long i;                    // standard counter.
  15.     unsigned short int planes;          // number of planes in image (must be 1)  
  16.     unsigned short int bpp;             // number of bits per pixel (must be 24)
  17.     char temp;                          // temporary color storage for bgr-rgb conversion.
  18.     // make sure the file is there.
  19.     if ((file = fopen(filename, "rb" ))==NULL)
  20.     {
  21. printf("File Not Found : %s\n",filename);
  22. return 0;
  23.     }
  24.    
  25.     // seek through the bmp header, up to the width/height:
  26.     fseek(file, 18, SEEK_CUR);
  27.     // read the width
  28.     if ((i = fread(&image->sizeX, 4, 1, file)) != 1) {
  29. printf("Error reading width from %s.\n", filename);
  30. return 0;
  31.     }
  32.     printf("Width of %s: %lu\n", filename, image->sizeX);
  33.    
  34.     // read the height  
  35.     if ((i = fread(&image->sizeY, 4, 1, file)) != 1) {
  36. printf("Error reading height from %s.\n", filename);
  37. return 0;
  38.     }
  39.     printf("Height of %s: %lu\n", filename, image->sizeY);
  40.    
  41.     // calculate the size (assuming 24 bits or 3 bytes per pixel).
  42.     size = image->sizeX * image->sizeY * 3;
  43.     // read the planes
  44.     if ((fread(&planes, 2, 1, file)) != 1) {
  45. printf("Error reading planes from %s.\n", filename);
  46. return 0;
  47.     }
  48.     if (planes != 1) {
  49. printf("Planes from %s is not 1: %u\n", filename, planes);
  50. return 0;
  51.     }
  52.     // read the bpp
  53.     if ((i = fread(&bpp, 2, 1, file)) != 1) {
  54. printf("Error reading bpp from %s.\n", filename);
  55. return 0;
  56.     }
  57.     if (bpp != 24) {
  58. printf("Bpp from %s is not 24: %u\n", filename, bpp);
  59. return 0;
  60.     }
  61.     // seek past the rest of the bitmap header.
  62.     fseek(file, 24, SEEK_CUR);
  63.     // read the data.  
  64.     image->data = (char *) malloc(size);
  65.     if (image->data == NULL) {
  66. printf("Error allocating memory for color-corrected image data" );
  67. return 0;
  68.     }
  69.     if ((i = fread(image->data, size, 1, file)) != 1) {
  70. printf("Error reading image data from %s.\n", filename);
  71. return 0;
  72.     }
  73.     for (i=0;i<size;i+=3) { // reverse all of the colors. (bgr -> rgb)
  74. temp = image->data[i];
  75. image->data[i] = image->data[i+2];
  76. image->data[i+2] = temp;
  77.     }
  78.    
  79.     // we're done.
  80.     return 1;
  81. }
  82.    
  83. // Load Bitmaps And Convert To Textures
  84. void LoadGLTextures() {
  85.     // Load Texture
  86.     Image *image1;
  87.    
  88.     // allocate space for texture
  89.     image1 = (Image *) malloc(sizeof(Image));
  90.     if (image1 == NULL) {
  91. printf("Error allocating space for image" );
  92. exit(0);
  93.     }
  94.     if (!ImageLoad("avatar.bmp", image1)) {
  95. exit(1);
  96.     }       
  97.     // Create Texture  
  98.     glGenTextures(1, &texture[0]);
  99.     glBindTexture(GL_TEXTURE_2D, texture[0]);   // 2d texture (x and y size)
  100.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture
  101.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture
  102.     // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image,  
  103.     // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself.
  104.     glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data);
  105. };


Message édité par Chronoklazm le 09-01-2005 à 19:26:37
Reply

Marsh Posté le 04-01-2005 à 11:32:23   

Reply

Marsh Posté le 04-01-2005 à 11:44:00    

T'as pas un problème dans le morceau "reverse all of the colors. (bgr -> rgb)" ?

Reply

Marsh Posté le 04-01-2005 à 11:46:54    

Non je crois pas, je mets en commentaire cette boucle for et c'est toujours pareil ...

Reply

Marsh Posté le 04-01-2005 à 11:54:10    

Et le pire c'est que ca "assombri" toute la scene, tous mes objets "coloriés" donc non texturés deviennent sombres, j'ai testé plusieurs textures ca vient pas d ela texture elle meme, j'ai l'impression que le rouge "infecte" les couleurs dans le buffer general enfin je sais pas comment le dire autrement :(


Message édité par Chronoklazm le 04-01-2005 à 11:54:40
Reply

Marsh Posté le 04-01-2005 à 12:28:03    

Bon j'ai trouvé dans "OpenGL Super Bible" la fonction glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); et comme par magie ca m'affiche bien les couleurs reeles des textures mais ca fausse completement les couleurs des objets que j'avais colorié à la main (avec glColor3f) :snif:  
 

Code :
  1. GL_MODULATE : Texture pixels “filter” existing pixel colors on the screen.
  2. GL_DECAL : Texture pixels replace existing pixels on the screen.
  3. GL_BLEND : Texture pixels “filter” existing pixels colors and are combined with a constant color.


 
En gros ... je comprends rien mais c'est pas grave :(


Message édité par Chronoklazm le 04-01-2005 à 12:29:06
Reply

Marsh Posté le 04-01-2005 à 12:33:50    

tu ne te serais pas planté dans le "saut" de l'entête car en regardant le format bmp (j'ai trouvé ça sur google j'espère qu'il n'est pas faux !) http://www.fortunecity.com/skyscra [...] ffrmt.html j'ai l'impression que l'entête est plus grande que 25 octets donc décalage donc pb de couleurs... en plus il semblerait que les pixels fassent 4 octets et non pas trois...


Message édité par dreameddeath le 04-01-2005 à 12:36:15
Reply

Marsh Posté le 04-01-2005 à 12:35:35    

C'est ce que je me disais. Grosse probleme dans la routine de lecture de l'image, quand il inverse les couleurs...

Reply

Marsh Posté le 04-01-2005 à 12:37:28    

Bah il est clair que le bitmap est un peu plus compliqué qu'une série de pixels de 3 octets (bgr) !

Reply

Marsh Posté le 04-01-2005 à 12:40:06    

j'ai trouvé le format sur microsoft à l'adresse http://msdn.microsoft.com/library/ [...] s_5jhv.asp faudrait comparer avec ce que tu as fait (taille de l'entête, etc...)

Reply

Marsh Posté le 04-01-2005 à 12:57:02    

heuuuu le GLUT as pas de loader de BMP/TGA & co ?

Reply

Marsh Posté le 04-01-2005 à 12:57:02   

Reply

Marsh Posté le 04-01-2005 à 12:58:33    

C'est cool merci pour le lien :)
 
A mon avis ca vient du fait que je fait tout ca sous cygwin et que les bmp proviennent du Paint de windows ... et je doute que les 2 ont le meme type de headers.

Reply

Marsh Posté le 04-01-2005 à 13:00:31    

le binaire restant le même cygwin/paint même combat... je pense qu'il faut mieux s'orienter vers des fonctions standards (cf le post de bjone)

Reply

Marsh Posté le 04-01-2005 à 13:03:54    

bjone a écrit :

heuuuu le GLUT as pas de loader de BMP/TGA & co ?


 
Ca ce serai d'enfer ! mais à mon avis c'est mort ce serait trop beau pour etre vrai, sachant que glut a été abandoné depuis 1997 je crois.

Reply

Marsh Posté le 04-01-2005 à 13:07:58    

Les bmp ce serait pas du RGBA par hasard ?

Reply

Marsh Posté le 04-01-2005 à 16:21:36    

J'ai un autre gros probleme, des que je charge plusieurs textures dans mon tableau de textures et je selectionne la texture voulue avec glBindTexture(GL_TEXTURE_2D, texture[type]) ou le type est un int ... j'obtiens toujours la meme texture partout cad la derniere de mon tableau de textures. Je pige pas :(
 

Code :
  1. void LoadGLTextures() {
  2.     // Load Texture
  3.     Image *image;
  4.    
  5.     // allocate space for texture
  6.     image = (Image *) malloc(sizeof(Image));
  7.    
  8.     if (image == NULL) {
  9. printf("Error allocating space for image" );
  10. exit(0);
  11.     }
  12.  
  13.     // if (!ImageLoad("Textures/brick.bmp", image1)) {
  14.     // exit(1);
  15.     //}
  16.     for(loop=0;loop<5;loop++)
  17.       {
  18. switch(loop)
  19.   {
  20.   case 0:
  21.     ImageLoad("Textures/brick1.bmp", image);
  22.     break;
  23.    
  24.   case 1:
  25.     ImageLoad("Textures/brick2.bmp", image);
  26.     break;
  27.    
  28.   case 2:
  29.     ImageLoad("Textures/ball.bmp", image);
  30.     break;
  31.    
  32.   case 3:
  33.     ImageLoad("Textures/pad.bmp", image);
  34.     break;
  35.    
  36.   case 4:
  37.     ImageLoad("Textures/background.bmp", image);
  38.     break;
  39.   }
  40. glBindTexture(GL_TEXTURE_2D, texture[loop]);
  41. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  42. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  43. glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX, image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data);
  44.       }
  45.      
  46. }


 

Reply

Marsh Posté le 04-01-2005 à 16:36:23    

que valent tes variables texture[i]?

Reply

Marsh Posté le 04-01-2005 à 18:25:41    

0 pour toutes les valeurs de i

Reply

Marsh Posté le 04-01-2005 à 18:27:42    

bah faudrait pas donner un autre numéro à la texture ? ou alors j'ai pas compris ce que faisait glBindTexture

Reply

Marsh Posté le 04-01-2005 à 18:33:02    

Elle permet de choisir quelle texture on veux appliquer glTexCoord ...
 

Code :
  1. glBindTexture(GL_TEXTURE_2D, texture[type]);   // choose the texture to use.
  2.   //glPushMatrix ();
  3.   glBegin (GL_QUADS);
  4.   glTexCoord2f(0.0f, 0.0f);          glVertex2f (x-width/2, y+height/2);
  5.   glTexCoord2f(1.0f, 0.0f);          glVertex2f (x-width/2, y-height/2);
  6.   glTexCoord2f(1.0f, 1.0f);          glVertex2f (x+width/2, y-height/2);
  7.   glTexCoord2f(0.0f, 1.0f);          glVertex2f (x+width/2, y+height/2);
  8.   glEnd ();


Reply

Marsh Posté le 04-01-2005 à 18:34:18    

donc faudrait peut-être que les différent texture[i] est des valeurs différentes (genre 1,2,3, ...)

Reply

Marsh Posté le 04-01-2005 à 18:42:51    

C'est vrai mais meme quand il m'affiche une texture partout toutes les valeurs de texture[i] valent 0 ??!!??

Reply

Marsh Posté le 04-01-2005 à 18:45:50    

bah pour moi c'est normal, tu charges toutes les textures avec comme numéro 0 donc à chaque fois tu écrase texture précédemment chargée : il ne reste que la dernière...

Reply

Marsh Posté le 04-01-2005 à 18:52:46    

Ah j'ai trouvé, j'ai oublié l'instruction  glGenTextures() qui les crée ... et voila un oubli cherement payé !
 
:fou:  :fou:  :fou:  :fou:  :fou:

Reply

Marsh Posté le 04-01-2005 à 18:53:22    

Merci dreameddeath :)


Message édité par Chronoklazm le 04-01-2005 à 18:53:55
Reply

Marsh Posté le 04-01-2005 à 18:56:24    

bah je t'ai pas beaucoup aidé (juste des idées en l'air). mais bon sans avoir jamais fait d'openGL... :p

Reply

Marsh Posté le 04-01-2005 à 18:57:18    

Et bien tu as vu comment on peut s'y éclater :)

Reply

Marsh Posté le 04-01-2005 à 19:08:29    

Je sais pas si t'as corrigé, mais les noms (identifiants) des textures sont des unsigned int.

Reply

Marsh Posté le 04-01-2005 à 19:28:45    

Tu veux dire changer int texture[5] en GLuint ... si c'est ca j'ai testé et ca change rien au niveau de "l'infection" du buffer general par le rouge (dans le cas ou j'applique pas la fonction glTexEnvi).

Reply

Marsh Posté le 04-01-2005 à 19:32:42    

mets des snapshots de ton problème sur http://www.imageshack.us/

Reply

Marsh Posté le 04-01-2005 à 20:00:04    

Voilà
 
Avec glTexEnvi(... GL_BLEND)
http://img140.exs.cx/my.php?loc=im [...] end4qy.jpg
 
Avec glTexEnvi(... GL_DECAL) => la c'est nikel ... mais il y a un beug kamem
http://img140.exs.cx/my.php?loc=im [...] cal4me.jpg
 
Sans glTexEnvi
http://img140.exs.cx/my.php?loc=im [...] cal1lx.jpg
 
Le beug, comme je l'ai dit plus haut reside dans le fait que les choses que je colorie a la main avec glColor prenent tous la couleur du bord de la premiere texture (celle dans texture[0]) j'ai fait des tests et si je mets du rose le cadre et la balle deviennent roses etc ...


Message édité par Chronoklazm le 04-01-2005 à 20:06:39
Reply

Marsh Posté le 04-01-2005 à 20:13:51    

En fait je me suis trompé, c'est la couleur des bords de la derniere texture qui est extrapolé et non de la premiere ...
Enfin une image est plus parlante :
http://img140.exs.cx/my.php?loc=im [...] eug8un.jpg

Reply

Marsh Posté le 04-01-2005 à 23:43:24    

Bon alors on va reprendre tranquillement quelques bases.
 
Premierement oui je parlais bien de ton int texture[1]; qu'il faut changer en GLuint texture[1];. Si tu regardes le prototype de glGenTextures, tu verras que le 2e parametre attendu est bien un GLuint*. Donc en lui filant un int*, tu as un cast implicite avec surement un warning du compilo. "Ca change rien" mais fournir des parametres avec le bon type, c'est quand meme la base.
 
Ensuite, parlons du texturage. Il faut bien avoir a l'esprit qu'OpenGL est une "state machine". Quand tu modifie l'état, tout ce qui suit est affecté par ce changement. Si tu veux texturer certains objets, tu utilises glEnable(GL_TEXTURE_2D), tu envoies tes primitives avec les coordonnées de textures, et voila! Sauf que pour les objets non texturés qui suivent, faut pas oublier de faire le glDisable(GL_TEXTURE_2D). Sinon, meme si tu ne fournis pas de coordonnées de texture, OpenGL va utiliser les dernieres coordonnées connues, et ce pour toutes les vertices qui suivent. Il va donc fetcher le dernier texel désigné et l'utiliser pour le calcul des fragments.
 
Autre chose que tu n'as pas l'air d'avoir assimilé : au niveau des textures, il y a deux choses qui entrent en ligne de compte dans leur utilisation.  
 - D'un coté les propriétés de chaque texture, que tu définis par glTexParameter. A chaque glTexParameter tu modifies le parametre de la texture courante (la derniere bindée). Ces parametres sont persistants et font partie de l'état attaché à la texture. A chaque fois que tu binderas la texture, les parametres ainsi définis seront utilisés.  
 - De l'autre coté, il y a l'état de l'unité de texturage. C'est ce que modifie glTexEnv. La il s'agit de définir comment on va combiner plusieurs couleurs qui arrivent simultanément pour calculer la couleur finale du fragment. Les couleurs qu'il faut combiner sont d'une part la couleur courante (attribuée par glColor ou calculée par le module d'éclairage) et d'autre part la couleur du texel correspondant aux coordonnées de textures. J'insiste sur le fait qu'il y a toujours une couleur courante, meme si tu n'en as pas spécifié explicitement.  
 
Bon alors comment on mélange les couleurs? C'est ce que décide GL_TEXTURE_ENV_MODE. Par défaut (il y a toujours des valeurs par défaut, ce qu'on appelle aussi l'état initial de la machine ;)), c'est GL_MODULATE. Ce mode multiplie la couleur courante avec le texel. Petite parenthse : comme on multiplie des valeurs (les intensités lumineuses des différentes couches) entre 0.0f et 1.0f (peu importe le type, ça revient au meme), le résultat est toujours inférieur au plus grand des deux, donc on "assombrit" la scene - fin de la parenthese. Comme c'est pas ce qui t'intéresse, il faut donc effectivement que tu utilises explicitement glTexEnv pour changer ce mode. GL_DECAL ou GL_REPLACE devraient faire l'affaire dans ton cas. GL_BLEND pas trop, ça fait intervenir la couleur associée à l'unité de texture. Je rappelle que ce mode est une propriété associée à l'unité de texture (courante dans le contexte du multi-texturing, sinon il n'y en a qu'une). Si tu as plusieurs types d'objets dont certains sont texturés avec GL_DECAL et d'autres avec GL_MODULATE, il faudra faire le changement adéquat à chaque fois (le bind de la texture ne suffit pas).
 
Bon alors quand t'auras bien digéré tout ça, tu comprendras mieux ce qui se passe ;)

Reply

Marsh Posté le 05-01-2005 à 00:00:31    

Merci pour ce cours d'openGL pour les nuls ;) , ça a le mérite de mettre les choses au clair.

Reply

Marsh Posté le 05-01-2005 à 00:25:39    

C'est super sympa merci :) J'y vois un peu plus clair maintenant, ca va marcher de feu de dieu :)

Reply

Marsh Posté le 09-01-2005 à 19:02:25    

Petit UP !
 
Voila si vous avez un peu de temps et que vous voulez tester un ptit casse-brique :) Ya quelques ptits bugs mais sinon c'est du bon :D !
Voici le lien : http://corbieres.unice.fr/~bodnart [...] public.zip
C'est pour windows pour l'instant.  
 
Le code source sera dispo lundi soir, dans le meme fichier.
 
EDIT : Demandez le moi plutot ... comme ca au moins je saurais si ca interesse qq'un :)


Message édité par Chronoklazm le 10-01-2005 à 19:08:49

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 12-01-2005 à 23:15:38    

héhé ça m'a rappelé mes bons vieux souvenirs d'arkanoid sur CPC :D
Ca fait bizarre de jouer à la souris mais bon, on s'y fait. C'est un peu trop facile à mon avis. Je me rappelle que au clavier sur le CPC, il fallait un certain temps pour aller de gauche a droite (et donc fallait essayer d'anticiper). La avec un grand coup de souris c'est "instantané".  
 
Bon sinon pour les choses qui fachent ;) :  
 - je suis tombé sur un bug ou la balle restait collée contre le mur et ne faisait que monter et descendre (screenshot).
 - en quittant (touche esc), j'ai vu furtivement un crash dans la console, chose confirmée par padbal.exe.stackdump (access violation)
 - cygwin1.dll 1.08Mo
 - la balle unicolore est pas super sexy comparée au reste qui est texturé
[apres deuxieme essai]
 - ça plante si on perd la balle normale et qu'on a encore la balle bonus (pas de réponse)

Reply

Marsh Posté le 13-01-2005 à 00:32:44    

Merci de l'avoir testé, c'est cool :)
 
Pour le bug de la balle qui reste collé c'est un probleme de gestion de collision, je me suis battu toute une soirée sans resultat et j'ai laissé tomber en pensant que ca arriverai assez rarement (bein non en fait) mais ce devrait pouvoir se regler ...
 
Pour la creation du fichier padbal.exe.stackdump, c'est assez bizzare en effet ... il apparait a chaque fois apres le lancement.  
 
Pour la taille de cygwin1.dll je suis d'accord elle est un peu démesurée :) Je ne sais pas éditer les .dll encore il y a peut etre plein de choses inutiles a virer ...
 
Pour la texture de la balle c'est sur c'est pas top, faut que je trouve un tuto sur les placages de textures sur des objets non-carrés :D Ce seras reglé !
 
Pour le bug de la balle normale si la bonus y est encore ce sera reglé le plus vite possible aussi !
 
Je pense rajouter un truc du style apres le troisieme niveau la barre se retrecit tous les 2 niveau ....
 
Merci pour les commentaires en tout cas :)


Message édité par Chronoklazm le 13-01-2005 à 00:34:01

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed