Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1685 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°936405
Chronoklaz​m
Posté le 04-01-2005 à 11:32:23  profilanswer
 

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
mood
Publicité
Posté le 04-01-2005 à 11:32:23  profilanswer
 

n°936435
FlorentG
Posté le 04-01-2005 à 11:44:00  profilanswer
 

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

n°936444
Chronoklaz​m
Posté le 04-01-2005 à 11:46:54  profilanswer
 

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

n°936454
Chronoklaz​m
Posté le 04-01-2005 à 11:54:10  profilanswer
 

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
n°936508
Chronoklaz​m
Posté le 04-01-2005 à 12:28:03  profilanswer
 

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
n°936511
dreameddea​th
Posté le 04-01-2005 à 12:33:50  profilanswer
 

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
n°936512
FlorentG
Posté le 04-01-2005 à 12:35:35  profilanswer
 

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

n°936515
dreameddea​th
Posté le 04-01-2005 à 12:37:28  profilanswer
 

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

n°936516
dreameddea​th
Posté le 04-01-2005 à 12:40:06  profilanswer
 

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...)

n°936538
bjone
Insert booze to continue
Posté le 04-01-2005 à 12:57:02  profilanswer
 

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

mood
Publicité
Posté le 04-01-2005 à 12:57:02  profilanswer
 

n°936542
Chronoklaz​m
Posté le 04-01-2005 à 12:58:33  profilanswer
 

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.

n°936544
dreameddea​th
Posté le 04-01-2005 à 13:00:31  profilanswer
 

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)

n°936548
Chronoklaz​m
Posté le 04-01-2005 à 13:03:54  profilanswer
 

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.

n°936553
Chronoklaz​m
Posté le 04-01-2005 à 13:07:58  profilanswer
 

Les bmp ce serait pas du RGBA par hasard ?

n°936844
Chronoklaz​m
Posté le 04-01-2005 à 16:21:36  profilanswer
 

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. }


 

n°936874
dreameddea​th
Posté le 04-01-2005 à 16:36:23  profilanswer
 

que valent tes variables texture[i]?

n°937089
Chronoklaz​m
Posté le 04-01-2005 à 18:25:41  profilanswer
 

0 pour toutes les valeurs de i

n°937092
dreameddea​th
Posté le 04-01-2005 à 18:27:42  profilanswer
 

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

n°937100
Chronoklaz​m
Posté le 04-01-2005 à 18:33:02  profilanswer
 

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 ();


n°937103
dreameddea​th
Posté le 04-01-2005 à 18:34:18  profilanswer
 

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

n°937119
Chronoklaz​m
Posté le 04-01-2005 à 18:42:51  profilanswer
 

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

n°937123
dreameddea​th
Posté le 04-01-2005 à 18:45:50  profilanswer
 

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...

n°937133
Chronoklaz​m
Posté le 04-01-2005 à 18:52:46  profilanswer
 

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:

n°937134
Chronoklaz​m
Posté le 04-01-2005 à 18:53:22  profilanswer
 

Merci dreameddeath :)


Message édité par Chronoklazm le 04-01-2005 à 18:53:55
n°937139
dreameddea​th
Posté le 04-01-2005 à 18:56:24  profilanswer
 

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

n°937141
Chronoklaz​m
Posté le 04-01-2005 à 18:57:18  profilanswer
 

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

n°937160
retrox
Posté le 04-01-2005 à 19:08:29  profilanswer
 

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

n°937178
Chronoklaz​m
Posté le 04-01-2005 à 19:28:45  profilanswer
 

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).

n°937181
bjone
Insert booze to continue
Posté le 04-01-2005 à 19:32:42  profilanswer
 

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

n°937202
Chronoklaz​m
Posté le 04-01-2005 à 20:00:04  profilanswer
 

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
n°937210
Chronoklaz​m
Posté le 04-01-2005 à 20:13:51  profilanswer
 

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

n°937402
retrox
Posté le 04-01-2005 à 23:43:24  profilanswer
 

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 ;)

n°937413
dreameddea​th
Posté le 05-01-2005 à 00:00:31  profilanswer
 

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

n°937421
Chronoklaz​m
Posté le 05-01-2005 à 00:25:39  profilanswer
 

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

n°949529
Chronoklaz​m
Posté le 09-01-2005 à 19:02:25  profilanswer
 

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 !
n°952076
retrox
Posté le 12-01-2005 à 23:15:38  profilanswer
 

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)

n°952102
Chronoklaz​m
Posté le 13-01-2005 à 00:32:44  profilanswer
 

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 !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

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

 

Sujets relatifs
[RESOLU]problème de récupération de dateProblème TextArea + Javascript
impossible d'ajouter des composants OCX sur VB6 [Résolu]problème avec fichier .htaccess
Problème d'affichage des enregistrements dans un DataReport VB6Problème de hasard et répétitions
[Debian][FMOD] Probleme enregistrement au micro[PHP] Erreur lors d'un test d'un cookie inexistant [Résolu]
blender + opengl @ glut 
Plus de sujets relatifs à : [OpenGL] Probleme avec le rouge ... [resolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR