Problème avec les textures en opengl

Problème avec les textures en opengl - C++ - Programmation

Marsh Posté le 14-07-2006 à 19:01:03    

Bonjour, voici le code de la lecon 19 de nehe que j'ai modifié :

Code :
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <windows.h>
  4. #include <GL/glut.h>
  5. #include <jpeglib.h>
  6. #include <jerror.h>
  7. #define MAX_PARTICLES 1000  // Number Of Particles To Create
  8. unsigned char *image;
  9. bool keys[256];     // Array Used For The Keyboard Routine
  10. bool active=TRUE;    // Window Active Flag Set To TRUE By Default
  11. bool fullscreen=TRUE;   // Fullscreen Flag Set To Fullscreen Mode By Default
  12. bool rainbow=true;    // Rainbow Mode?
  13. bool sp;       // Spacebar Pressed?
  14. bool rp;       // Enter Key Pressed?
  15. float slowdown=0.4f;    // Slow Down Particles
  16. float xspeed;      // Base X Speed (To Allow Keyboard Direction Of Tail)
  17. float yspeed;      // Base Y Speed (To Allow Keyboard Direction Of Tail)
  18. GLuint loop;      // Misc Loop Variable
  19. GLuint col;      // Current Color Selection
  20. GLuint delay;      // Rainbow Effect Delay
  21. GLuint texture[1];     // Storage For Our Particle Texture
  22. void idle(int);
  23. typedef struct      // Create A Structure For Particle
  24. {
  25. bool active;     // Active (Yes/No)
  26. float life;     // Particle Life
  27. float fade;     // Fade Speed
  28. float r;      // Red Value
  29. float g;      // Green Value
  30. float b;      // Blue Value
  31. float x;      // X Position
  32. float y;      // Y Position
  33. float z;      // Z Position
  34. float xi;      // X Direction
  35. float yi;      // Y Direction
  36. float zi;      // Z Direction
  37. float xg;      // X Gravity
  38. float yg;      // Y Gravity
  39. float zg;      // Z Gravity
  40. }
  41. particles;       // Particles Structure
  42. particles particle[MAX_PARTICLES]; // Particle Array (Room For Particle Info)
  43. /* ----------------------------------------------------------------------------*/
  44. void loadJpegImage(char *fichier, int numtex)
  45. {
  46.   struct jpeg_decompress_struct cinfo;
  47.   struct jpeg_error_mgr jerr;
  48.   FILE *file;
  49.   unsigned char *ligne;
  50.   cinfo.err = jpeg_std_error(&jerr);
  51.   jpeg_create_decompress(&cinfo);
  52.   if ((file=fopen(fichier,"rb" ))==NULL)
  53.     {
  54.       fprintf(stderr,"Erreur : impossible d'ouvrir le fichier texture.jpg\n" );
  55.       system("PAUSE" );
  56.       exit(1);
  57.     }
  58.   jpeg_stdio_src(&cinfo, file);
  59.   jpeg_read_header(&cinfo, TRUE);
  60.   image= new unsigned char [cinfo.image_width*cinfo.image_height*3];
  61.   if (cinfo.jpeg_color_space==JCS_GRAYSCALE) {
  62.     fprintf(stdout,"Erreur : l'image doit etre de type RGB\n" );
  63.     system("PAUSE" );
  64.     exit(1);
  65.   }
  66.   jpeg_start_decompress(&cinfo);
  67.   ligne=image;
  68.   while (cinfo.output_scanline<cinfo.output_height)
  69.     {
  70.       ligne=image+3*cinfo.image_height*cinfo.output_scanline;
  71.       jpeg_read_scanlines(&cinfo,&ligne,1);
  72.     }
  73.   jpeg_finish_decompress(&cinfo);
  74.   jpeg_destroy_decompress(&cinfo);
  75.  
  76.  
  77.  
  78.   /* Paramétrage de la texture */
  79.   glBindTexture(GL_TEXTURE_2D,numtex);
  80.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  81.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  82.   glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,cinfo.image_width,cinfo.image_height,0,GL_RGB,GL_UNSIGNED_BYTE,image);
  83.  
  84.  
  85.   delete [] image;
  86.  
  87. }
  88. /* ----------------------------------------------------------------------------*/
  89. void resize(int width, int height)
  90. {
  91. glViewport(0,0,width,height);      // Reset The Current Viewport
  92. glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix
  93. glLoadIdentity();         // Reset The Projection Matrix
  94. // Calculate The Aspect Ratio Of The Window
  95. gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,90.0f);
  96. glMatrixMode(GL_MODELVIEW);       // Select The Modelview Matrix
  97. glLoadIdentity();
  98. }
  99. /* ----------------------------------------------------------------------------*/
  100. void display()
  101. {
  102. glutTimerFunc(30,idle,0);        // Le timer
  103.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  104.    
  105.     glTranslatef(0.0,0.0,-4.3);
  106.     glRotatef(25.0,1.0,0.0,0.0);
  107.     glScalef(0.1,0.1,0.1);
  108.     for (loop=0;loop<MAX_PARTICLES;loop++)     // Loop Through All The Particles
  109. {
  110.             float x=particle[loop].x;      // Grab Our Particle X Position
  111.   float y=particle[loop].y;      // Grab Our Particle Y Position
  112.   float z=particle[loop].z;     // Particle Z Pos + Zoom
  113.     // Draw The Particle Using Our RGB Values, Fade The Particle Based On It's Life
  114.   glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life);
  115.   glBegin(GL_TRIANGLE_STRIP);      // Build Quad From A Triangle Strip
  116.       glTexCoord2d(1,1); glVertex3f(x+0.5f,y,z+0.5f); // Top Right
  117.    glTexCoord2d(0,1); glVertex3f(x-0.5f,y,z+0.5f); // Top Left
  118.    glTexCoord2d(1,0); glVertex3f(x+0.5f,y,z-0.5f); // Bottom Right
  119.    glTexCoord2d(0,0); glVertex3f(x-0.5f,y,z-0.5f); // Bottom Left
  120.   glEnd();          // Done Building Triangle Strip
  121.    }
  122.    
  123.    
  124.     glutSwapBuffers();
  125. }
  126. /* ----------------------------------------------------------------------------*/
  127. void idle(int numero)
  128. {
  129. glLoadIdentity();          // Reset The ModelView Matrix
  130. for (loop=0;loop<MAX_PARTICLES;loop++)     // Loop Through All The Particles
  131. {
  132.  if (particle[loop].active)       // If The Particle Is Active
  133.  {
  134.   float x=particle[loop].x;      // Grab Our Particle X Position
  135.   float y=particle[loop].y;      // Grab Our Particle Y Position
  136.   float z=particle[loop].z;     // Particle Z Pos + Zoom
  137.   particle[loop].x+=particle[loop].xi/(slowdown*1000);// Move On The X Axis By X Speed
  138.   particle[loop].y+=particle[loop].yi/(slowdown*1000);// Move On The Y Axis By Y Speed
  139.   particle[loop].z+=particle[loop].zi/(slowdown*1000);// Move On The Z Axis By Z Speed
  140.   particle[loop].xi+=particle[loop].xg;   // Take Pull On X Axis Into Account
  141.   particle[loop].yi+=particle[loop].yg;   // Take Pull On Y Axis Into Account
  142.   particle[loop].zi+=particle[loop].zg;   // Take Pull On Z Axis Into Account
  143.   particle[loop].life-=particle[loop].fade;  // Reduce Particles Life By 'Fade'
  144.   }
  145.      
  146.      
  147.        }
  148.      
  149.      
  150.      
  151.     glutPostRedisplay();
  152. }
  153. /* ----------------------------------------------------------------------------*/
  154. /* Program entry point */
  155. int main(int argc, char *argv[])
  156. {
  157.     glutInit(&argc, argv);
  158.     glutInitWindowSize(800,600);
  159.     glutInitWindowPosition(10,10);
  160.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  161.     glutCreateWindow("Test particules" );
  162.    
  163.     // OpenGL
  164.     glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
  165. glClearColor(0.0f,0.0f,0.0f,0.0f);     // Black Background
  166. glClearDepth(1.0f);         // Depth Buffer Setup
  167. glEnable(GL_BLEND);         // Enable Blending
  168. glBlendFunc(GL_SRC_ALPHA,GL_ONE);     // Type Of Blending To Perform
  169. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // Really Nice Perspective Calculations
  170. glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);    // Really Nice Point Smoothing
  171. glEnable(GL_TEXTURE_2D);       // Enable Texture Mapping
  172. glGenTextures(1,texture);
  173.     loadJpegImage("particle.jpg",texture[0]);
  174. glBindTexture(GL_TEXTURE_2D,texture[0]);   // Select Our Texture
  175. for (loop=0;loop<MAX_PARTICLES;loop++)    // Initials All The Textures
  176. {
  177.  particle[loop].active=true;        // Make All The Particles Active
  178.  particle[loop].life=16.0f;        // Give All The Particles Full Life
  179.  particle[loop].fade=float(rand()%100)/1000.0f+0.003f; // Random Fade Speed
  180.  particle[loop].r=1.0;
  181.  particle[loop].g=1.0;
  182.  particle[loop].b=0.67;
  183.  particle[loop].xi=float((rand()%50)-26.0f)*5.0f;  // Random Speed On X Axis
  184.  particle[loop].yi=float((rand()%50)-25.0f);             // Random Speed On Y Axis
  185.  particle[loop].zi=float((rand()%50)-25.0f)*5.0f;  // Random Speed On Z Axis
  186.  particle[loop].xg=0.0f;         // Set Horizontal Pull To Zero
  187.  particle[loop].yg=-0.8f;        // Set Vertical Pull Downward
  188.  particle[loop].zg=0.0f;         // Set Pull On Z Axis To Zero
  189. }
  190. // Fin initialisation opengl
  191.    glClearColor(0,0,0,1);
  192.    
  193.    
  194.    
  195.    
  196.    
  197.     glutReshapeFunc(resize);
  198.     glutDisplayFunc(display);
  199.     glutMainLoop();
  200. }


 
je souhaitais ne générer que l'explosion (essayer donc de le compiler pour voir), légèrement vue du dessus (la forme rectangulaire de la zone de particules ne me dérange pas), ce afin de l'insérer dans une scène déjà existante dans un autre programme
 
ici, l'explosion marche parfaitement, cependant, quand je l'insère dans l'autre scène, on voit que la texture de particle (pour l'avoir, télécharger la ici : http://nehe.gamedev.net/data/lessons/devc/lesson19.zip) (je l'ai recompressé en jpeg) est rectangulaire et à des bords noirs !!! alors qu'on ne devrait voir que la sphère lumineuse (le centre de l'image). J'espère que vous avez compris, car c'est pas évident à expliquer si vous ne téléchargez pas les fichiers
 
Merci d'avance de votre aide
 
NC

Reply

Marsh Posté le 14-07-2006 à 19:01:03   

Reply

Marsh Posté le 17-07-2006 à 21:08:14    

mh ... en fait tu veux qu'on modifie un tuto à ta place ?
jveux pas dire, mais un code complet dans un message, c'est un peu indigeste :s


---------------
tutos de programmation 3D :
Reply

Marsh Posté le 17-07-2006 à 21:28:24    

ben en fait, après relecture, je m'apercois que la seule difficulté que j'ai est de transformer les pixels 'noirs' de la texture en pixels transparents

Reply

Marsh Posté le 17-07-2006 à 21:42:12    

ah ! c'est différent ^^ ca c'est une question :p renseigne toi (google) sur la fonction glTexEnv ,  glBlendMode ... et ce qui s'y rapporte (skuz pour le manque de précision, mais ca fait au moins 6 mois que j'ai plus touché aux textures openGL...
 
en fait il suffit de spécifier à openGL de quelle manière les polygones doivent être dessinés... par défaut, ils cachent ceux dessinés en dessous... mais si tu veux de la transparence, il faudra que quand opengl dessine un pixel, il efface pas celui du dessous, mais se "mélange" avec lui.
 
 
Ceci dit, si tu veux juste effacer les parties VRAIMENT toutes noires (ce qui risque d'etre moche car il n'y aurra aucun fondu si ya un dégradé de noir)  il faut recréer ton tableau de texture non pas en rgb, mais en rgba (rouge vert bleu et alpha) en mettant ttes les valeurs alpha à 1.0f, sauf la ou  c'est noir. ensuite, quand tu construiras ta texture, il faudra mettre GL_RGBA à la place de GL_RGB.
 
Ou tu peux faire un mix des deux techniques en modulant la valeur alpha en fonction de la "sombreur" des pixels, mais je suis pas sur que ce soit vraiment utile ;)


---------------
tutos de programmation 3D :
Reply

Marsh Posté le 02-08-2006 à 10:03:46    

ok merci pour votre réponse et désolé pour le retard de la mienne ;)
 
Bon je pense que je vais faire ainsi : en fait mon image est en tons de gris donc r=g=b.
 
De ce fait, je vais faire en sorte que r=g=b=a (comme ca quand c'est noir, donc que r=0,a=0)
 
Qu'en pensez vous ?

Reply

Sujets relatifs:

Leave a Replay

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