Se stai realizzando un'immagine prospettica e il tuo modello ha intersezioni implicite, quindi, se usi "Z lineare", tali intersezioni appariranno nei punti sbagliati.
Ad esempio, considera un semplice piano di massa con una linea di poli telefonici, che si allontana in lontananza, che perfora il terreno (e continua sotto). Le intersezioni implicite saranno determinate dai valori di profondità interpolati. Se quelli non sono interpolati 1/Z
, quindi quando i vertici proiettati sono stati calcolati con la prospettiva, l'immagine apparirà errata.
Mi scuso per la qualità non estetica delle seguenti illustrazioni, ma le ho fatte nel '97.
La prima immagine mostra l'effetto di rendering richiesto. (Si noti che i "tralicci" blu vanno abbastanza lontano sotto il piano terra, quindi vengono ritagliati nella parte inferiore delle immagini)
Questa seconda immagine mostra il risultato dell'utilizzo di un buffer di profondità non reciproco: (Chiedo scusa per il cambio di scala: questi sono stati copiati da un vecchio documento MS Word e non ho idea di cosa sia successo con il ridimensionamento.)
Come puoi vedere, i risultati non sono corretti.
In un'altra nota, sei sicuro di voler davvero una rappresentazione Z lineare? Se stai eseguendo il rendering in prospettiva, sicuramente vuoi una maggiore precisione più vicino alla fotocamera che a distanza?
Per il tuo commento successivo:
"Se quelli non sono interpolati con 1 / Z" che non capisco. Che interpolazione è quella?
La prima cosa da notare è che, con una proiezione prospettica standard, le linee rette nello spazio mondiale rimangono rette nello spazio prospettico. Le distanze / lunghezze, tuttavia, non vengono conservate.
Per semplicità, supponiamo che venga utilizzata una trasformazione prospettica banale per proiettare i vertici, ovvero
Si dovrebbe anche calcolare una profondità reciproca schermo-spazio, ad esempio ma Z lineare nel buffer di profondità sarebbe, per me, richiedono qualcosa di simile: (Possiamo assumere qui che scala = 1)XSc r e e n=XWo r l dZWo r l d
YSc r e e n=YWo r l dZWo r l d
ZSc r e e n=1ZWo r l d
ZSc r e e n= s c a l e ∗ZWo r l d
Supponiamo di avere una linea con i punti finali dello spazio mondiale
Con la mappatura prospettica queste mappe sono coordinate dello spazio dello schermo
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢200010⎤⎦⎥
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢2000.1⎤⎦⎥
Il sistema di rendering / hardware interpoleranno linearmente lo spazio dello schermo z, quindi nel punto 1/2 della linea, come appare sullo schermo, cioè in pixel (10, 0), otterremmo una Z proiettata (inversa) valore di 0,55, che corrisponde a un valore del valore Z dello spazio mondiale di ~ 1.818. Dati i valori Z iniziale e finale, questo è di circa il 20% lungo la lunghezza della linea.
Se invece provassimo a interpolare usando i valori Z originali, finiremmo con Z corrispondente a un valore dello spazio mondiale di 5,5. Finché nulla si interseca, potresti essere a posto (non ci ho pensato troppo a fondo) ma qualsiasi cosa con intersezioni implicite sarà errata.
Quello che non ho menzionato è che una volta introdotto il texturing corretto in prospettiva (o anche l'ombreggiatura corretta in prospettiva), è necessario eseguire l'interpolazione per pixel di 1 / w e, inoltre, calcolare, per pixel, il reciproco di quel valore interpolato.
far / z
, che è standard, non ha senso. Produce un buffer di profondità che diventa più lineare quanto più i due piani di clip si avvicinano. Sembra una fusione di due concetti: Z lineare nello spazio dello schermo e una mappatura del buffer di profondità non costante per un hack delle prestazioni.