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.