Si está haciendo una imagen en perspectiva y su modelo tiene intersecciones implícitas, si usa "Z lineal", esas intersecciones aparecerán en los lugares incorrectos.
Por ejemplo, considere un plano de tierra simple con una línea de postes telefónicos, retrocediendo en la distancia, que perfora el suelo (y continúe a continuación). Las intersecciones implícitas serán determinadas por los valores de profundidad interpolados. Si no se interpolan 1/Z
, entonces cuando los vértices proyectados se hayan calculado con perspectiva, la imagen se verá incorrecta.
Pido disculpas por la calidad no estética de las siguientes ilustraciones, pero las hice en el '97.
La primera imagen muestra el efecto de representación requerido. (Tenga en cuenta que los "pilones" azules van bastante lejos debajo del plano del suelo, por lo que se recortan en la parte inferior de las imágenes)
Esta segunda imagen muestra el resultado del uso de un búfer de profundidad no recíproco: (Disculpas por el cambio de escala: se copiaron de un documento antiguo de MS Word y no tengo idea de lo que sucedió con el escalado).
Como puede ver, los resultados son incorrectos.
En otra nota, ¿estás seguro de que realmente quieres una representación Z lineal? Si representa la perspectiva, ¿seguramente uno quiere más precisión más cerca de la cámara que a distancia?
Re su comentario posterior:
“Si esos no están interpolados con 1 / Z” que no entiendo. ¿Qué interpolación es esa?
Lo primero a tener en cuenta es que, con una proyección de perspectiva estándar, las líneas rectas en el espacio mundial siguen siendo líneas rectas en el espacio en perspectiva. Las distancias / longitudes, sin embargo, no se conservan.
Para simplificar, supongamos que se utiliza una transformación de perspectiva trivial para proyectar los vértices, es decir
XSc r e e n=XWo r l dZWo r l d
YSc r e e n=YWo r l dZWo r l d
También debemos calcular una profundidad de espacio de pantalla recíproca, p. Ej.ZSc r e e n=1ZWo r l d
pero la Z lineal en el búfer de profundidad requeriría, para mí, algo como: ZSc r e e n= s c a l e ∗ZWo r l d
(Podemos suponer aquí que escala = 1)
Supongamos que tenemos una línea con puntos finales del espacio mundial⎡⎣⎢0 00 01⎤⎦⎥un n d⎡⎣⎢2000 010⎤⎦⎥
Con el mapeo en perspectiva, estas coordenadas de mapa a espacio de pantalla
⎡⎣⎢0 00 01⎤⎦⎥un n d⎡⎣⎢200 00.1⎤⎦⎥
El sistema / hardware de renderizado interpolará linealmente el espacio z de la pantalla, por lo que en el punto medio de la línea, como aparece en la pantalla, es decir, en el píxel (10, 0), obtendríamos una Z proyectada (inversa) valor de 0.55, que corresponde a un valor del espacio mundial Z valor de ~ 1.818. Dados los valores iniciales y finales de Z, esto es aproximadamente el 20% a lo largo de la línea.
Si, en cambio, tratamos de interpolar usando los valores Z originales, terminaríamos con Z correspondiente a un valor de espacio mundial de 5.5. Mientras nada se cruce, puede que estés bien (no lo he pensado demasiado) pero cualquier cosa con intersecciones implícitas será incorrecta.
Lo que no he mencionado es que una vez que introduce texturas correctas en perspectiva (o incluso sombreado correcto en perspectiva), debe hacer una interpolación por píxel de 1 / w y, además, también calcular, por píxel, el recíproco de ese valor interpolado.
far / z
, que es estándar, no tiene sentido. Produce un búfer de profundidad que se vuelve más lineal cuanto más cerca están los dos planos de clip. Parece una combinación de dos conceptos: espacio de pantalla Z lineal y un mapeo de búfer de profundidad no constante para un truco de rendimiento.(x, y, z) / w
por fragmento, pero aparentemente, en cambio, tenemos que tratar con una versión interpolada linealmente de(x/w, y/w, z/w)
? Eso no me parece razonable en 2018, ¡pero sería bueno saber si ese es el truco con el que tenemos que vivir por ahora de todos modos!Usar Z / W para el búfer de profundidad es más profundo que simplemente recortar contra los planos cercanos y lejanos. Como Simon aludió, esto tiene que ver con la interpolación entre los vértices de un triángulo, durante la rasterización.
Z / W es la opción única que permite que los valores de profundidad NDC se calculen correctamente para los puntos en el interior del triángulo, simplemente interpolando linealmente los valores de profundidad NDC desde los vértices, en el espacio de la pantalla . En principio, podríamos usar cualquier función que nos guste para asignar el espacio Z de la cámara al valor del búfer de profundidad, pero cualquier otra opción que no sea Z / W requeriría una matemática más complicada por píxel, lo que sería más lento y más difícil de Construir en hardware.
Tenga en cuenta que si usa un búfer de profundidad lineal, entonces, por supuesto, los valores de profundidad de interpolación lineal serán correctos en el espacio mundial ... ¡pero no, en general, en el espacio de la pantalla! Y es el espacio de la pantalla lo que importa para la rasterización, ya que necesitamos poder generar valores de profundidad correctos en perspectiva (y otros valores de atributos, como los UV) para cada centro de píxeles u otro punto de muestra, dentro de los límites del espacio de pantalla de un triángulo siendo rasterizado.
fuente