dessiner la valeur de la profondeur dans opengl en utilisant des shaders
Je tiens à attirer le tampon de profondeur dans le fragment shader, je fais ceci:
Vertex shader:
varying vec4 position_;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position_ = gl_ModelViewProjectionMatrix * gl_Vertex;
Fragment shader:
float depth = ((position_.z /position_.w) + 1.0) * 0.5;
gl_FragColor = vec4(depth, depth, depth, 1.0);
Mais tout ce que je imprimer est blanc, ce que je fais mal?
source d'informationauteur hidayat
Vous devez vous connecter pour publier un commentaire.
Dans quelle place voulez-vous de tirer la profondeur? Si vous voulez dessiner la fenêtre de l'espace de la profondeur, vous pouvez le faire:
Cependant, ce ne sera pas particulièrement utile, puisque la plupart des numéros sera très proche de 1.0. Seulement extrêmement proches les objets seront visibles. C'est la nature de la distribution des valeurs de la profondeur pour un tampon de profondeur à l'aide d'une norme de la projection en perspective.
Ou, pour le dire d'une autre manière, c'est pourquoi tu es blanc.
Si vous souhaitez que ces valeurs dans un espace linéaire, vous aurez besoin de faire quelque chose comme ce qui suit:
En effet, la "profondeur" de la valeur d'un fragment peut être lu à partir z valeur dans le clip de l'espace (qui est, après tout, des transformations de matrice). C'est largement correct.
Cependant, votre problème est dans la division par
w
.La Division par
w
est appelé point de vue de diviser. Oui, il est nécessaire pour la projection en perspective pour fonctionner correctement.Cependant. La Division par
w
dans ce cas "grappes" toutes vos valeurs (comme vous l'avez vu), d'être très proche de 1.0. Il y a une bonne raison à cela: dans un projection en perspectivew= (some multiplier) *z
. Qui est, vous êtes en divisant la valeur de z (quelle qu'elle a été calculée à l'être) par les (certaines) d'origine z. Pas étonnant que vous obtenez toujours des valeurs de près de 1,0. Vous êtes presque divisant z par lui-même.Très simple pour résoudre ce problème, essayez de diviser
z
seulement par le farPlane, et l'envoyer au fragment shader comme profondeur.Vertex shader
Fragment shader:
Le résultat est pas mal, très linéaire à la recherche de fondu.