[OpenGL] shadow volume

shadow volume [OpenGL] - C++ - Programmation

Marsh Posté le 04-05-2007 à 22:47:43    

Bonjour,
 
J'essaye d'implémenter les shadows volume dans mon programme.
1) Donc j'ai fait ma fonction qui affiche le volume d'ombre et elle fonctionne très bien.
2) Maintenant j'essaye d'afficher l'ombre grace au sencil buffer mais ça ne fonctionne pas :
 

Code :
  1. //On rempli le sencil buffer
  2.         glDepthMask(0);
  3.         glColorMask(0, 0, 0, 0);
  4.         glDisable(GL_CULL_FACE);
  5.         glEnable(GL_STENCIL_TEST);
  6.         glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
  7.         glClear(GL_STENCIL_BUFFER_BIT);
  8.         glActiveStencilFaceEXT(GL_BACK);
  9.         glStencilOp(GL_KEEP,            // stencil test fail
  10.                     GL_KEEP,            // depth test fail
  11.                     GL_DECR_WRAP_EXT);  // depth test pass
  12.         glStencilMask(~0);
  13.         glStencilFunc(GL_ALWAYS, 0, ~0);
  14.         glActiveStencilFaceEXT(GL_FRONT);
  15.         glStencilOp(GL_KEEP,            // stencil test fail
  16.                     GL_KEEP,            // depth test fail
  17.                     GL_INCR_WRAP_EXT);  // depth test pass
  18.         glStencilMask(~0);
  19.         glStencilFunc(GL_ALWAYS, 0, ~0);
  20. CShadowVolume::showShadowVolume(this, entities); //dessine le volume d'ombre
  21. glColorMask(1, 1, 1, 1);
  22. glStencilFunc(GL_EQUAL, 0, ~0);
  23. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  24. //Affiche du gris aux zones d'ombre
  25. glColor3f(0.7, 0.7, 0.7);
  26. glMatrixMode(GL_PROJECTION);
  27. glPushMatrix();
  28.  glLoadIdentity();
  29.  glOrtho(0.0, CRendererOGL::getSceneWidth(), CRendererOGL::getSceneHeight(), 0.0, -1.0, 1.0);
  30.  glMatrixMode(GL_MODELVIEW);
  31.  glPushMatrix();
  32.   glLoadIdentity();
  33.   glBegin(GL_QUADS);
  34.    glVertex2f(0.0, 0.0);
  35.    glVertex2f(CRendererOGL::getSceneWidth(), 0.0);
  36.    glVertex2f(CRendererOGL::getSceneWidth(), CRendererOGL::getSceneHeight());
  37.    glVertex2f(0.0, CRendererOGL::getSceneHeight());
  38.   glEnd();
  39.   glMatrixMode(GL_PROJECTION);
  40.  glPopMatrix();
  41.  glMatrixMode(GL_MODELVIEW);
  42. glPopMatrix();
  43. glColor3f(1.0, 1.0, 1.0);
  44. glDisable(GL_STENCIL_TEST);
  45. glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);
  46. glDepthMask(1);
  47. glEnable(GL_CULL_FACE);


 
J'ai un écran tout gris....et le pire c'es si je remplace cette ligne glStencilFunc(GL_EQUAL, 0, ~0) par glStencilFunc(GL_NOTEQUAL, 0, ~0), j'ai aussi un écran tout gris. Alors que le gris devrait être affiché qu'aux zones d'ombre :(
 
Merci d'avance...


Message édité par casafa le 04-05-2007 à 22:48:20
Reply

Marsh Posté le 04-05-2007 à 22:47:43   

Reply

Marsh Posté le 05-05-2007 à 23:44:53    

Vu que personne ne semble savoir répondre à ma question :( , j'aimerais savoir si il est possible de récupérer les bits du stencil buffer ? Comme ça je pourrait voir plus facilement où se trouve l'erreur dans mon code, merci

Reply

Marsh Posté le 06-05-2007 à 09:35:55    

Je ne sais pas si c'est exactement ce que tu cherches mais toutes les valeurs que tu peux query par rapport au Stencil Buffer sont :
GL_STENCIL_FUNC, GL_STENCIL_REF, GL_STENCIL_VALUE_MASK, GL_STENCIL_FAIL, GL_STENCIL_PATH_DEPTH_FAIL, GL_STENCIL_PASS_DEPTH_PASS.
 
A récuperer avec glGetIntegerv.

Reply

Marsh Posté le 06-05-2007 à 11:40:48    

Merci pour cette réponse mais ça ne m'aide pas.
 
Ce que j'aurais voulu récupérer c'est le buffer du stencil pour savoir par exemple à quel valeur se trouve le pixel 1024,544...

Reply

Marsh Posté le 06-05-2007 à 15:16:59    

Je crois que j'ai trouvé ce que tu cherches en fait.
 
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
 
avec format = GL_STENCIL_INDEX.
 
C'est tout ce que j'ai reussi a trouver. j'espere que ca va aider!
 

Reply

Sujets relatifs:

Leave a Replay

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