Immagino che questa sia più una domanda di matematica che una OpenGL, ma sto divagando. Ad ogni modo, se lo scopo della divisione della prospettiva è quello di ottenere le coordinate xey utilizzabili, perché preoccuparsi di dividere z da w? Inoltre, come ottengo w in primo luogo?Perché divido Z da W in una proiezione prospettica in OpenGL?
risposta
In realtà, la spiegazione ha molto più a che fare con i limiti del buffer di profondità di quanto non faccia la matematica.
Nella sua forma più semplice, "il buffer di profondità è una trama in cui a ciascun pixel sullo schermo viene assegnato un valore in scala di grigi in base alla distanza dalla telecamera, consentendo di modificare facilmente gli effetti visivi con la distanza". Source
Più precisamente, un buffer di profondità è una struttura contenente il valore di z/w per ogni fragment, dove:
- Z è la distanza dal piano di ritaglio vicino al frammento.
- W è la distanza dalla fotocamera al frammento.
Nel seguente diagramma illustrante la relazione tra z, w e z/w, n è uguale al parametro zNear
passato a gluPerspective
, o una funzione equivalente, e f equivale al parametro zFar
passato alla stessa funzione.
A prima vista, questo sistema sguardo intuitivo. Ma come risultato, z/w è sempre un valore a virgola mobile tra 0 e 1 (0/n e f/f), e può quindi essere rappresentato come un singolo canale di un struttura.
Una seconda nota importante: il buffer di profondità è non lineare, ovvero un oggetto esattamente in mezzo tra i piani di ritaglio vicini e lontani non è affatto vicino a un valore di 0,5 nel buffer di profondità. Come mostrato sopra, sarebbe correlato a un valore di 0,999 nel buffer di profondità. A seconda del punto di vista, questo potrebbe essere buono o cattivo; potreste volere che il buffer di profondità sia più dettagliato in primo piano (che è), o che offra anche dettagli dettagliati (cosa che non lo è).
TL; DR:
- Si divide z da w quindi è sempre nell'intervallo [0, 1].
- W è la distanza dalla fotocamera al frammento.
Davvero non sono d'accordo con questa risposta, la domanda riguarda un problema puramente matematico, quello che viene spiegato qui è un dettaglio di implementazione dell'algoritmo opengl e del buffer z (il buffer di profondità). –
La z in NDC è nell'intervallo [-1, 1], non [0, 1] che è la convenzione DirectX. – SnappleLVR
http: //en.wikipedia.org/wiki/Transformation_matrix # Perspective_projection –
Questo ha a che fare con le coordinate omogenee. Il mapping di R^3 -> R^4 non è chiaramente uno a uno. Il fattore w può essere 'cannonizzato' a 1. Ma se si applica un operatore di matrice 4x4, il risultato 'w' potrebbe cambiare. Se ricordo bene, un vantaggio delle coordinate omogenee è di avere la traduzione come un operatore lineare. – Yotam