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.