2017-07-25 4 views
0

Pour illustrer simplement mon problème, j'essaye de rendre un maillage large mais simple à une texture à utiliser plus tard, mais étrangement, plus loin -les parties de ce mesh qui sont en dehors de la caméra sont affichées devant les parties les plus proches de la caméra, lorsqu'elles sont vues sous un angle spécifique. Malgré le fait indéniable que je fais au-delà de toute utilisation doute le test de profondeur:Le tri de profondeur OpenGL échoue sur un maillage unique, lors du rendu au framebuffer au lieu de l'écran

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 

À titre d'exemple, je suis en train de rendre une grille (sur le plan XZ) subdivisé Centré sur l'origine, avec une surface lisse « colline » au milieu de la grille.

Lors du rendu à l'écran aucune erreur se produit et le maillage ressemble à ceci (rendu par projection orthographiques, et avec la couleur de gris représentant la profondeur, aucune erreur ne sera en outre se produire même si le maillage est vue de tout côté):

Rendering directly to screen, no errors occur, even when mesh is rotated

rendu à l'écran est bien sûr fait en vous assurant que le framebuffer est réglé sur 0 (glBindFramebuffer(GL_FRAMEBUFFER, 0);), mais je dois rendre cette scène à un autre framebuffer qui n'est pas mon écran, afin de pouvoir utiliser ce rendu comme une texture.
J'ai donc mis en place un autre framebuffer, et une texture de sortie, et maintenant je redirige cette scène vers le framebuffer (avec absolument rien, excepté le framebuffer et la taille de viewport). Dans le but de démontrer l'erreur que j'expérimente, je rends ensuite cette texture rendue sur un plan qui est ensuite affiché sur l'écran. Lorsque le maillage est pivoté vu de l'axe x positif, et tourné autour de l'axe y, centré sur son origine entre -0,5 π rad et 0,5 π rad, la texture rendue est exactement identique au résultat lors du rendu au écran, comme on le voit sur l'image ci-dessus.

Cependant, lorsque la rotation autour de l'axe y est supérieure à 0,5 π rad ou inférieure à -0,5 π rad, la pente la plus proche de la caméra est rendue derrière le plan plus éloigné de la caméra (le fait que la colline est plus proche de la caméra peut être prouvé en regardant la couleur, ce qui représente debth):

enter image description here

(oups obtenu le titre erroné sur la fenêtre, ignorer)

Dans le régions frontalières avec une rotation autour de l'axe y de près de 0,5 π rad ou -0,5 π rad la scène ressemble à ceci.

enter image description here

(oups a obtenu le titre erroné sur la fenêtre à nouveau, ignorer à nouveau)

Pour récapituler. Cette erreur avec le tri en profondeur ne se produit que lors du rendu d'une texture à l'aide d'un framebuffer, et uniquement lorsque l'objet est vu sous un angle spécifique. Lorsque l'objet est rendu directement à l'écran, aucune erreur ne se produit. Ma question est la suivante: pourquoi cela arrive-t-il, et comment (le cas échéant) puis-je éviter de l'éviter?

+0

Cette première image ... ne ressemble pas à une projection orthographique. Cela ressemble à une projection de perspective pour moi. –

Répondre

1

Si ce problème ne se produit que lorsque vous restituez le framebuffer de texture, vous n'avez probablement pas de pièce jointe en profondeur correctement liée.

Assurez-vous que pendant FBO init vous liez aussi à une texture de profondeur. Voici un bon exemple de la façon de procéder: here.

De même, vérifiez toutes les matrices que vous utilisez pour le rendu - J'ai déjà eu plusieurs cas où des matrices incorrectes ont jeté des calculs de profondeur.

+0

Il s'agissait de la texture profondeur/tampon qui n'était pas liée au tampon d'image de droite. – Nikolaj