OpenGL, réccupération d'un rendu offscreen

OpenGL, réccupération d'un rendu offscreen - C++ - Programmation

Marsh Posté le 22-06-2009 à 10:51:05    

Bonjour,
 
Je suis en train de développer un logiciel 3D avec openGL dont voici le but :
 
charger un .obj - Ok
faire un rendu d'une scène 3D en offscreen - Ok ( Rendu dans une fenêtre normale, juste sans le ShowWindow )
récupérer ce rendu comme une texture - C'est ici que je suis bloqué
mapper sur l'objet précédemment chargé cette texture - Ne devrait pas poser de problème une fois l'étape précédente validée
afficher l'objet ainsi texturer - de même
 
Comme décrit ci-dessus je suis bloqué au niveau de la récupération de l'image... Auriez vous une piste à me proposer ?
Peut-être que le rendu de la scène dans une fenêtre non affichée n'est pas la bonne solution, je suis preneur de toutes vos idées / suggestions :)
 
Merci de m'avoir lu, et merci d'avance pour votre aide  :jap:  


---------------
Mon Feed-Back
Reply

Marsh Posté le 22-06-2009 à 10:51:05   

Reply

Marsh Posté le 22-06-2009 à 11:04:01    

Hello,
 
Je pense que ce tutorial peux t'intéresser : http://nehe.gamedev.net/data/lesso [...] ?lesson=26  
 
C'est pour faire un effet de reflexion sur une surface, cela en utilisant le stencil buffer. Ca me semble très proche de ce que tu veux faire.

Reply

Marsh Posté le 22-06-2009 à 11:09:22    

Merci beaucoup, je lis ça tout de suite :)
 
Je vous tiens au courant de l'avancement


---------------
Mon Feed-Back
Reply

Marsh Posté le 22-06-2009 à 11:39:02    

Le problème avec cette solution c'est qu'elle n'introduit pas de mapping.
 
En gros elle me permettrait de "dessiner la scène dans l'objet chargé"
hors le but est que cette scène soit mapper à l'objet chargé, introduisant une déformation selon celui-ci.
Exemple : l'objet chargé peut être un trapèze ABCD
la scène est rendue dans une offscreen ( Carré EFGH )
Le but est d'afficher la scène en faisant coïncider les coins EFGH et ABCD


---------------
Mon Feed-Back
Reply

Marsh Posté le 22-06-2009 à 12:22:10    

J'ai trouvé ça : http://nehe.gamedev.net/data/lesso [...] ?lesson=36
 
Je vous en dis plus dans quelques temps :)


---------------
Mon Feed-Back
Reply

Marsh Posté le 22-06-2009 à 15:47:14    

ça avance, ça avance.
Grâce à la leçon 36 linkée dans le post précédent j'arrive à créer ma texture.
Mon soucis est maintenant tout autre...
En effet, mon objet .obj chargé est en fait un plan composé de plusieurs polygones. Ainsi quand je veux mapper ma texture sur ce plan, elle se map en fait sur chaque polygone le composant...

 

Une idée pour pouvoir considérer ce plan comme une seule surface ?


Message édité par Arry le 22-06-2009 à 15:48:12

---------------
Mon Feed-Back
Reply

Marsh Posté le 22-06-2009 à 16:06:29    

tes coordonnées UV (une paire de valeurs pour chaque sommet de ton objet qui dit quel point de la texture va à cet endroit) doivent pas être bonnes.


Message édité par 0x90 le 22-06-2009 à 16:07:06

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 23-06-2009 à 10:35:22    

En fait c'est bon, on m'a fournit un .mtl avec le obj.
J'ai donc une seule et même surface et le programme marche bien.
 
Par contre par soucis d'optimisation je pense que je vais tester l'extension FBO ( http://www.songho.ca/opengl/gl_fbo.html )
En effet pour l'instant je draw la scène, je copie ce rendu dans une texture et j'applique la texture... Déjà 20ms rien que pour la copie.


---------------
Mon Feed-Back
Reply

Marsh Posté le 23-06-2009 à 11:54:46    

Oui les rendertargets efficaces en OpenGl ce sont les FBO.

Reply

Marsh Posté le 23-06-2009 à 16:26:52    

Par contre que j'utilise la première méthode ou les FBO, j'ai une modification des couleurs de l'objet qui est rendu dans une texture...

 

Quelqu'un saurait d'où ça peut venir ?

 

EDIT: j'ai essayé tous les espaces de couleurs possible au moment de la création et du rendu de la texture


Message édité par Arry le 23-06-2009 à 16:27:39

---------------
Mon Feed-Back
Reply

Marsh Posté le 23-06-2009 à 16:26:52   

Reply

Marsh Posté le 23-06-2009 à 16:50:12    

code, binaire...
 
Si tu fais par shader, essaye de faire la sortie sur une couleur à la fois pour voir.
 

Reply

Marsh Posté le 23-06-2009 à 17:08:27    

Voici le code de la 1ère version ( plus simple )

 
Code :
  1. // Fonction qui crée une texture vide
  2. bool glEngine::EmptyTexture(int width, int height) {
  3. glGenTextures(1, &scene);                // Create 1 Texture
  4. glBindTexture(GL_TEXTURE_2D, scene);             // Bind The Texture
  5. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);   // Build Texture Using Information In data
  6. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  7. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  8. glBindTexture(GL_TEXTURE_2D, 0);
  9. return true;
  10. }
  11. // Fonction principale de dessin
  12. bool glEngine::DrawScene() {
  13. RenderToTexture();
  14. DrawTexturedObj();
  15. return true;
  16. }
  17. // Fonction de rendu d'un cube dans une texture
  18. void glEngine::RenderToTexture() {
  19. glBindTexture(GL_TEXTURE_2D,scene);
  20. DrawCube();
  21. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA , 0, 0, width, height, 0);
  22. glBindTexture(GL_TEXTURE_2D,0);
  23. }
  24. // Fonction de dessin de l'objet loader, avec la texture créée
  25. void glEngine::DrawTexturedObj() {
  26. glMatrixMode(GL_PROJECTION);
  27. glLoadIdentity();
  28. glOrtho(0,width,0,height,0.001,10000);
  29. glViewport(0,0,width,height);
  30. glMatrixMode(GL_MODELVIEW);       // Select The Modelview Matrix
  31. glLoadIdentity();         // Reset The Modelview Matrix
  32. glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
  33. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  34. glEnable(GL_TEXTURE_2D);       // Enable 2D Texture Mapping
  35. glBindTexture(GL_TEXTURE_2D,scene);     // Bind To The Texture
  36. glTranslatef(0.0f, 0.0f, -1.0f);
  37. glmDraw(parent->obj->pmodel, GLM_SMOOTH | GLM_TEXTURE);   // Draw loaded object with the texture
  38. glDisable(GL_TEXTURE_2D);       // Disable 2D Texture Mapping
  39. glBindTexture(GL_TEXTURE_2D,0);      // Unbind The Texture
  40. }
  41. // Fonction dessinant un cube
  42. bool glEngine::DrawCube() {
  43. static GLfloat rquad = 0;
  44. glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix
  45. glLoadIdentity();         // Reset The Projection Matrix
  46. gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
  47. glViewport(0,0,width,height);
  48. glMatrixMode(GL_MODELVIEW);       // Select The Modelview Matrix
  49. glLoadIdentity();         // Reset The Modelview Matrix
  50. glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
  51. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
  52. glTranslatef(0.0f, 0.0f, -7.0f);      // Move Right 1.5 Units And Into The Screen 7.0
  53. glRotatef(rquad, 1.0f, 1.0f, 1.0f);     // Rotate The Quad On The X axis ( NEW )
  54. glBegin(GL_QUADS);         // Draw A Quad
  55.  glColor4f(0.0f,1.0f,0.0f,0.0f);     // Set The Color To Green
  56.  glVertex3f( 1.0f, 1.0f,-1.0f);     // Top Right Of The Quad (Top)
  57.  glVertex3f(-1.0f, 1.0f,-1.0f);     // Top Left Of The Quad (Top)
  58.  glVertex3f(-1.0f, 1.0f, 1.0f);     // Bottom Left Of The Quad (Top)
  59.  glVertex3f( 1.0f, 1.0f, 1.0f);     // Bottom Right Of The Quad (Top)
  60.  glColor4f(1.0f,0.5f,0.0f,0.0f);     // Set The Color To Orange
  61.  glVertex3f( 1.0f,-1.0f, 1.0f);     // Top Right Of The Quad (Bottom)
  62.  glVertex3f(-1.0f,-1.0f, 1.0f);     // Top Left Of The Quad (Bottom)
  63.  glVertex3f(-1.0f,-1.0f,-1.0f);     // Bottom Left Of The Quad (Bottom)
  64.  glVertex3f( 1.0f,-1.0f,-1.0f);     // Bottom Right Of The Quad (Bottom)
  65.  glColor4f(1.0f,0.0f,0.0f,0.0f);     // Set The Color To Red
  66.  glVertex3f( 1.0f, 1.0f, 1.0f);     // Top Right Of The Quad (Front)
  67.  glVertex3f(-1.0f, 1.0f, 1.0f);     // Top Left Of The Quad (Front)
  68.  glVertex3f(-1.0f,-1.0f, 1.0f);     // Bottom Left Of The Quad (Front)
  69.  glVertex3f( 1.0f,-1.0f, 1.0f);     // Bottom Right Of The Quad (Front)
  70.  glColor4f(1.0f,1.0f,0.0f,0.0f);     // Set The Color To Yellow
  71.  glVertex3f( 1.0f,-1.0f,-1.0f);     // Top Right Of The Quad (Back)
  72.  glVertex3f(-1.0f,-1.0f,-1.0f);     // Top Left Of The Quad (Back)
  73.  glVertex3f(-1.0f, 1.0f,-1.0f);     // Bottom Left Of The Quad (Back)
  74.  glVertex3f( 1.0f, 1.0f,-1.0f);     // Bottom Right Of The Quad (Back)
  75.  glColor4f(0.0f,0.0f,1.0f,0.0f);     // Set The Color To Blue
  76.  glVertex3f(-1.0f, 1.0f, 1.0f);     // Top Right Of The Quad (Left)
  77.  glVertex3f(-1.0f, 1.0f,-1.0f);     // Top Left Of The Quad (Left)
  78.  glVertex3f(-1.0f,-1.0f,-1.0f);     // Bottom Left Of The Quad (Left)
  79.  glVertex3f(-1.0f,-1.0f, 1.0f);     // Bottom Right Of The Quad (Left)
  80.  glColor4f(1.0f,0.0f,1.0f,0.0f);     // Set The Color To Violet
  81.  glVertex3f( 1.0f, 1.0f,-1.0f);     // Top Right Of The Quad (Right)
  82.  glVertex3f( 1.0f, 1.0f, 1.0f);     // Top Left Of The Quad (Right)
  83.  glVertex3f( 1.0f,-1.0f, 1.0f);     // Bottom Left Of The Quad (Right)
  84.  glVertex3f( 1.0f,-1.0f,-1.0f);     // Bottom Right Of The Quad (Right)
  85. glEnd();           // Done Drawing The Quad
  86. rquad-=0.5f;          // Decrease The Rotation Variable For The Quad ( NEW )
  87. return true;
  88. }
 

donc le soucis c'est que à la sortie le cube est dessiné avec 3 faces rouges, une rose, une noire et une bleue
Or quand je le dessine hors de la texture, il a bien les couleurs demandées :/

 

Merci de votre aide :jap:


Message édité par Arry le 23-06-2009 à 17:10:33

---------------
Mon Feed-Back
Reply

Marsh Posté le 23-06-2009 à 17:31:41    

En gros voici les changements :
Vert -> Noir
Orange -> Rouge
Jaune -> Rouge
 
en gros la composante verte n'est pas prise en compte... mais pourquoi ?
 
 
EDIT: même si à la place d'un cube multicolore, je dessine juste un fond vert, la texture à l'arrivée ne comprend qu'un fond noir...


Message édité par Arry le 23-06-2009 à 17:40:21
Reply

Marsh Posté le 23-06-2009 à 18:05:25    

Envoye le binaire pour voir si sur ma machine ça marche, on sait jamais OpenGl, drivers, toussa :D

Reply

Marsh Posté le 23-06-2009 à 18:07:23    

La dernière couleur poussée est glColor4f(1.0f,0.0f,1.0f,0.0f), soit tout sauf le vert.
 
Est-ce que la copie derrière serait modulée/impactée par cette couleur ?


Message édité par bjone le 23-06-2009 à 18:07:34
Reply

Marsh Posté le 24-06-2009 à 08:46:31    

J'ai déjà essayé sur différentes machines, toujours la même chose... ça ne vient pas d'openGL :/
Je vais tester cette histoire de last color


---------------
Mon Feed-Back
Reply

Marsh Posté le 24-06-2009 à 08:48:51    

Après test ça venait bien de là... Étrange :/

 

J'ai juste rajouté un glColor4f(1.0f,1.0f,1.0f,0.0f) à la fin du drawing du cube


Message édité par Arry le 24-06-2009 à 08:51:24

---------------
Mon Feed-Back
Reply

Marsh Posté le 24-06-2009 à 10:00:50    

Par contre après test sur différentes machines, aucun gain de performances avec les FBOs :/


---------------
Mon Feed-Back
Reply

Marsh Posté le 24-06-2009 à 15:09:19    

Normalement les FBOs sont la manière correcte de le faire.
 
D'une part, il est possible que le driver détecte le pattern d'utilisation avec le glCopyTexImage2D et qu'il reforme le contexte avec un FBO.
 
Ensuite seul le FBO permet d'attacher des frames/depth/stencil buffers de résolutions indépendantes de la fenêtre de rendu.
 
Et les glVertex y'a pas plus daubé comme efficacité :)
 
Donc utilise les FBO, ça te sera utile quand tu voudra faire du HDR, de la réflexion/transparence shaderisée, et passe aux VBO pour avoir des Vertex et Index buffers.


Message édité par bjone le 24-06-2009 à 15:09:36
Reply

Sujets relatifs:

Leave a Replay

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