2010-04-28 6 views
0

Mon algorithme est le suivant:OpenGL FrameBuffer Objets comportement bizarre

rendu de la scène à une cartographie avec OIR ombre à partir d'emplacements multiples rendu de la scène à l'écran avec l'ombre cartographie ... magie noire que je dois encore imlement ... Combiner les échantillons de l'étape 1 avec l'image de l'étape 2

J'essaie de déboguer les étapes 1 et 2 et je rencontre le comportement STRANGE. Mon algorithme pour chaque ombre cartographié passe est: rendu de la scène à un OIR connecté à une texture de tableau de profondeur du POV de chaque lumière rendent la scène du point de vue et sommet/frag utilisation des shaders pour comparer les profondeurs

Lorsque Je lance mon algorithme de cette façon:

render de point à rendre OIR du point à l'écran glutSwapBuffers()

les vecteurs normaux dans le col de l'écran semblent être incorrect (inversé peut-être). Je suis assez sûr que c'est le problème parce que mon calcul d'éclairage diffuse est incorrect, mais les couleurs matérielles sont correctes, et les ombres apparaissent aux endroits corrects. Donc, il semble que la seule chose qui pourrait être le coupable est les normales.

Cependant, si je

render de point à rendre OIR du point à l'écran glutSwapBuffers() // ne va pas ici rendre du point à l'écran glutSwapBuffers()

la deuxième passe est correct . Je suppose qu'il y a un problème avec mes appels framebuffer. Quelqu'un peut-il voir quel est le problème du journal ci-dessous? C'est à partir d'une trace bugle grepped pour «tampon» avec quelques modifications pour le rendre un peu plus clair.

[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) 
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glDrawBuffer(GL_NONE) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
//start render to FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) 
[INFO] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0) 
//bind to the FBO attached to a depth tex array for shadows 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the FBO I want the shadow mapped image rendered to 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//draw geometry 

//draw to screen pass 
//again shadow mapping FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the screen 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

//second try at render to screen: 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
draw geometry 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//correct output
+0

Vouliez-vous vraiment dire "rendre du point à FBO rendre du point à l'écran glutSwapBuffers()" deux fois dans votre message? –

+0

Je voulais dire rendre le point à FBO, puis rendre le point à l'écran la première fois. La deuxième fois que je voulais dire, le rendu pointait sur FBO, le rendu sur Screen (les tampons d'échange ici me donnent une sortie incorrecte), puis le rendu à l'écran (les tampons d'échange me donnent la bonne sortie ici). Désolé pour la confusion, je suppose que mes sauts de ligne n'ont pas été formatés aussi clairement que je l'avais prévu. Mon soupçon est qu'il y a un paramètre de framebuffer qui est réglé trop tard par le premier passage et qui est OK pour le second, mais je ne sais pas ce que c'est. –

Répondre

0

Il n'y a rien de mal avec votre code OIR. Mais vous ne nous dites pas tout. Si tel était vraiment ce que vous faisiez:

[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

Ensuite, la sortie incorrecte serait écran noir (parce que vous liez le framebuffer par défaut, des tampons clairs et swaps). Il doit y avoir un rendu entre glClear() et glXSwapBuffers(). Vous devriez publier le code source complet à la place de cette trace grep-ped. Deuxièmement, votre problème n'a rien à voir avec les FBO. Ils n'affectent en rien l'éclairage, il est fort probable que vous ne configuriez pas correctement les matrices (il est facile de faire des erreurs lors du mixage lookat de la lumière et lookat de la caméra). Votre réponse est un peu désordonnée, il est donc probable que votre code soit un peu compliqué. Peut-être que vous devriez essayer de regarder là-bas ...