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
Vouliez-vous vraiment dire "rendre du point à FBO rendre du point à l'écran glutSwapBuffers()" deux fois dans votre message? –
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. –