Perché abbiamo bisogno di una quarta coordinata per dividere per z?


12

Ho letto la risposta qui:

Cosa fa la scheda grafica con il quarto elemento di un vettore come posizione finale?

"Il quarto componente è un trucco per tenere traccia della proiezione prospettica. Quando si esegue una proiezione prospettica, si desidera dividere per z: x '= x / z, y' = y / z, ma questa non è un'operazione che può essere implementato da una matrice 3x3 operante su un vettore di x, y, z. Il trucco che è diventato standard per farlo è quello di aggiungere una quarta coordinata, w, e dichiarare che x, y, z saranno sempre divisi per w dopo l'applicazione di tutte le trasformazioni e prima della rasterizzazione. "

ma non capivo perché non potevamo dividere per z usando una matrice 3x3?

non possiamo semplicemente moltiplicare per

1/z 0 0
0 1/z 0
0 0 1/z

ottenere [x/z y/z 1]

?


Prova ad esprimere una trasformazione (o composizione di trasformazioni) che include la traduzione da qualche parte nella catena. Senza un valore aw, non puoi esprimerlo in un'unica matrice.
DMGregory

Capisco la parte della traduzione ma non capisco come l'aggiunta di una quarta coordinata possa aiutare o è un trucco da dividere per z

Per quello che vale totalmente puoi fare quello che hai detto. La divisione di xey per z è un metodo valido per la conversione da coordinate 3d in uno spazio dello schermo 2d con proiezione in cui gli oggetti distanti diventano più piccoli. La w è una coordinata omogenea per portarla fino alla quarta dimensione per poter fare la traduzione.
Alan Wolfe,

Risposte:


14

Perché se dividi solo [x, y, z]per zottieni [x/z, y/z, 1]e perdi il valore effettivo di z, il che è effettivamente utile se vuoi fare un ritaglio del piano vicino / lontano o riempire un buffer Z.

Il modo migliore per conservare alcune informazioni z, almeno sulla GPU, è quindi usare 4 componenti anziché 3. In pratica, ciò che è effettivamente negli ultimi due componenti vettoriali prima della divisione prospettica dipende dal tipo di proiezione e dagli effetti volere.

Ad esempio, nel caso di una proiezione prospettica, questo è il vettore a 4 componenti risultante:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Dopo la divisione della prospettiva, il vettore diventa:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

E la c + d/zparte ci lascia con abbastanza informazioni per riempire il buffer Z.


Potresti dividere solo X e Y per Z, producendo [x / z, y / z, z]. La GPU non deve eseguire la divisione vettoriale, potrebbe essere stata progettata per eseguire qualsiasi calcolo.
user253751

3

Tecnicamente, si potrebbe farlo. Ma perché preoccuparsi? Quando avrai la finale z, puoi:

  • costruisci una matrice 3x3 come hai descritto, sprecando 9 * sizeof(float)byte di spazio, spendendo cicli per calcolare 1/z(una divisione) e poi facendo nove moltiplicazioni e sei aggiunte per ottenere il vertice finale, oppure
  • puoi fare tre divisioni, come attualmente fa la pipeline moderna

Uno di questi mi sembra molto più ottimale, e non è il primo. Anche se l'hardware ottimizzato esiste per la matrice si moltiplica, come sicuramente accade, è concettualmente più complesso di una semplice divisione.

Inoltre, una matrice 3x3 non può codificare una traduzione, e così una matrice 4x4 (e quindi la quarta wcoordinate) viene usato in precedenza in cantiere comunque . Ciò significa che hai già quel quarto componente seduto lì, quindi puoi anche usarlo per trasportare un valore utile e fare la tua divisione con esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.