Problème avec les polygones en opengl

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

Marsh Posté le 25-06-2006 à 19:58:04    

Bonjour, j'ai le code source suivant :  
 

Code :
  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3. double a=0,inca=0.1;
  4. /* Prototype des fonctions */
  5. void affichage();
  6. void clavier(unsigned char touche,int x,int y);
  7. void reshape(int x,int y);
  8. void idle();
  9. int main(int argc,char **argv)
  10. {
  11. /* initialisation de glut et creation
  12.     de la fenetre */
  13. glutInit(&argc,argv);
  14. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  15. glutInitWindowPosition(200,200);
  16. glutInitWindowSize(500,500);
  17. glutCreateWindow("Numéro 1" );
  18. /* Initialisation d'OpenGL */
  19. glClearColor(0.0,0.0,0.0,0.0);
  20. glShadeModel(GL_FLAT);
  21. /* enregistrement des fonctions de rappel */
  22. glutDisplayFunc(affichage);
  23. glutKeyboardFunc(clavier);
  24. glutReshapeFunc(reshape);
  25. glutIdleFunc(idle);
  26. /* Entree dans la boucle principale glut */
  27. glutMainLoop();
  28. return 0;
  29. }
  30. void affichage()
  31. {
  32. glClear(GL_COLOR_BUFFER_BIT);
  33. glLoadIdentity();
  34. glTranslatef(0.0,-0.5,0.0);
  35. glRotatef(10.0,1.0,0.0,0.0);
  36. glRotatef(a,0.0,1.0,0.0);
  37. glBegin(GL_POLYGON);
  38. glColor3f(0.0,1.0,1.0);
  39. glVertex3f( 0.0, 0.0, 0.0);
  40. glVertex3f( 0.1, 0.0, 0.0);
  41. glVertex3f( 0.1, 0.8, 0.0);
  42. glVertex3f( 0.0, 0.8, 0.0);
  43. glVertex3f(-0.2, 0.7, 0.0);
  44. glVertex3f(-0.2, 0.6, 0.0);
  45. glVertex3f( 0.0, 0.7, 0.0);
  46. glVertex3f( 0.0, 0.0, 0.0);
  47. glEnd();
  48. glFlush();
  49. glutSwapBuffers();
  50. }
  51. void clavier(unsigned char touche,int x,int y)
  52. {
  53. switch (touche)
  54.    {
  55.    case 'q' :
  56.    exit(0);
  57.    break;
  58.    
  59.    case 'a':
  60.    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  61.    break;
  62.  
  63.    case 'z':
  64.    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  65.    break
  66.  
  67.    }
  68. }
  69. void reshape(int x,int y)
  70. {
  71. if (x<y)
  72.    glViewport(0,(y-x)/2,x,x);
  73. else
  74.    glViewport((x-y)/2,0,y,y);
  75. }
  76. void idle()
  77. {
  78. a+=inca;
  79. if (a>360)
  80.    a-=360;
  81. glutPostRedisplay();
  82. }


 
Cependant, comme vous pouvez le voir si vous le compilez, quand on est en mode fil de fer, on obtient le chiffre 1 alors que quand on est en mode remplissage, on obtient une autre chose "bizarre"
Comment faire pour obtenir en mode remplissage un 1 correctement rempli ?
 
Merci d'avance
 
NC

Reply

Marsh Posté le 25-06-2006 à 19:58:04   

Reply

Marsh Posté le 25-06-2006 à 19:59:43    

tu pourrait pas mettre un exe compile avec les deux versions ??

Reply

Marsh Posté le 25-06-2006 à 20:43:42    

Le fichier est disponible ici : http://www.transferbigfiles.com/Do [...] 38931954c2 Pour changer de mode, les touches a et z : a : mode fil de fer, z mode remplissage
 

Reply

Marsh Posté le 25-06-2006 à 20:50:36    

Pour qu'OpenGL s'en sorte pour remplir ton polygone, ta figure doit être convexe, ce qui n'est pas le cas ici.  
Tu dois découper ta figure en plusieurs élements convexes (comme des triangles) et les afficher. Hésite pas à poser une question si tu comprends pas !
 
http://fr.wikipedia.org/wiki/Convexe


Message édité par Evadream -jbd- le 25-06-2006 à 20:52:52
Reply

Marsh Posté le 26-06-2006 à 09:19:55    

d'accord, mais n'y a-t-il aucun moyen de faire en sorte qu'il puisse remplir une figure concave ?

Reply

Marsh Posté le 26-06-2006 à 09:22:49    

Non c'est écrit dans la spec.

Reply

Marsh Posté le 26-06-2006 à 09:26:10    

Bon ok, reprenons le problème : j'ai un tableau de dimensions 2n qui contient les coordonnées de n points, n points qui formaient mon poylgone. Y a-t-il un moyen simple pour que opengl fasse les triangles ?
 
Une autre petite question : sur une carte graphique très bas de gamme (genre radeon 9000), combien de polygones peuvent être affichés simultanément en opengl sans que ca "rame" ?

Reply

Marsh Posté le 26-06-2006 à 09:43:40    

je crois que le coup de transformer n points comme ça en triangles, ça s'appelle la Tesselation.
 
Je crois aussi que c'est pas tout à fait trivial à calculer; un doc sur le sujet:
http://alrj.org/viewdoc.php?doc_id=126
 
Quant à sa gestion par opengl, ca reste carrément à vérifier.

Reply

Marsh Posté le 26-06-2006 à 17:19:23    

Voir aussi delaunay triangulation.
OpenGL est une API bas niveau qui se veut proche du hardware. Pour cette raison, il est nécessaire de fournir les données géométriques dans le format le plus proche du hardware, c'est a dire le triangle. Les polygones convexes sont facilement triangulables, c'est pour cela qu'ils sont supportés. En revanche, la triangulation de polygones non-convexes est plus compliquée, et ce n'est pas le role d'une API de le faire.
 
Sinon pour ce qui est d'une radeon 9000, il s'agit d'une carte à base de RV250, c'est à dire un chip techniquement inférieur au R200, c'est à dire à une radeon 8500.
Pour la question combien de polygones (parlons tout de suite de triangles), ça dépend fortement du type de rendu. La carte peut etre limitée par 1000 autres facteurs que le simple nombre de triangles (fillrate, bande passante mémoire, anti-aliasing, éclairage, shaders (tres limité sur ces cartes)).


Message édité par retrox le 26-06-2006 à 17:19:53
Reply

Marsh Posté le 26-06-2006 à 17:36:00    

ok merci de toutes vos réponses ;)

Reply

Sujets relatifs:

Leave a Replay

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