2012-05-16 10 views
40

quando si sta imparando la programmazione 3D, si è insegnato che è più facile pensare in termini di matrici di trasformazione 3:Perché sarebbe utile disporre di una matrice di proiezione separata, ma combinare il modello e la matrice di visualizzazione?

  1. Il modello Matrix. Questa matrice è individuale per ogni singolo modello e ruota e ridimensiona l'oggetto come desiderato e infine lo sposta nella sua posizione finale all'interno del tuo mondo 3D. "La Model Matrix trasforma le coordinate del modello in coordinate globali".

  2. The View Matrix. Questa matrice è solitamente la stessa per un grande numero di oggetti (se non per tutti) e ruota e sposta tutti gli oggetti in base alla "posizione della telecamera" corrente. Se immagini che la scena 3D è filmata da una telecamera e ciò che viene visualizzato sullo schermo sono le immagini catturate da questa fotocamera, la posizione della fotocamera e la sua direzione di visione definiscono quali parti della scena sono visibili e come gli oggetti appare sull'immagine catturata. Ci sono pochi motivi per cambiare la matrice di visualizzazione mentre si esegue il rendering di un singolo fotogramma, ma in realtà esistono (ad es. Eseguendo il rendering della scena due volte e cambiando la matrice di visualizzazione in mezzo, è possibile creare uno specchio molto semplice ma impressionante all'interno della scena) . Di solito la matrice della vista cambia una sola volta tra due frame disegnati. "The View Matrix trasforma le coordinate del mondo in coordinate dell'occhio".

  3. The Projection Matrix. La matrice di proiezione decide come quelle coordinate 3D sono mappate a coordinate 2D, ad es. se c'è una prospettiva applicata a loro (gli oggetti diventano più piccoli più lontano sono lontani dallo spettatore) o no (proiezione ortogonale). La matrice di proiezione non cambia quasi mai. Potrebbe essere necessario cambiare se si esegue il rendering in una finestra e la dimensione della finestra è cambiata o se si esegue il rendering a schermo intero e la risoluzione è cambiata, tuttavia solo se la nuova dimensione della finestra/risoluzione dello schermo ha un diverso rapporto di visualizzazione rispetto a prima. Ci sono alcuni effetti pazzi per cui potresti voler cambiare questa matrice ma nella maggior parte dei casi è praticamente costante per tutta la durata del tuo programma. "La Projection Matrix trasforma le coordinate dell'occhio in coordinate dello schermo".

Questo ha molto senso per me. Ovviamente si possono sempre combinare tutte e tre le matrici in una singola, poiché moltiplicare un vettore prima dalla matrice A e poi dalla matrice B equivale a moltiplicare il vettore per matrice C, dove C = B * A.

Ora, se si guarda alla classica OpenGL (OpenGL 1.x/2.x), OpenGL conosce una matrice di proiezione. Tuttavia OpenGL non offre un modello o una matrice di visualizzazione, offre solo una matrice di visualizzazione del modello combinata. Perché? Questo design ti obbliga a salvare e ripristinare in modo permanente la "matrice di visualizzazione" poiché verrà "distrutta" dalle trasformazioni del modello ad essa applicate. Perché non ci sono tre matrici separate?

Se si guardano le nuove versioni OpenGL (OpenGL 3.x/4.x) e non si usa la pipeline di rendering classica ma si personalizza tutto con shader (GLSL), non ci sono più matrici disponibili più a lungo , devi definire le tue matrici. La maggior parte delle persone mantiene ancora il vecchio concetto di matrice di proiezione e matrice di visualizzazione del modello. Perché dovresti farlo? Perché non utilizzare le tre matrici, il che significa che non è necessario salvare e ripristinare in modo permanente la matrice della vista modello o utilizzare una singola matrice combinata modello-vista-proiezione (MVP), che consente di risparmiare una moltiplicazione di matrice nel proprio vertice shader per sempre singolo vertice reso (dopotutto una tale moltiplicazione non è gratis).

Quindi, per riassumere la mia domanda: quale vantaggio ha una matrice di visualizzazione del modello combinata con una matrice di proiezione separata con tre matrici separate o una singola matrice MVP?

+6

Domanda molto dettagliata. – JCM

risposta

31

Guardalo praticamente. Innanzitutto, meno matrici vengono inviate, meno matrici si devono moltiplicare con posizioni/normali/ecc. E quindi, più velocemente i vertex shader.

Quindi punto 1: meno matrici è meglio.

Tuttavia, ci sono alcune cose che probabilmente devi fare. A meno che non si stia eseguendo il rendering 2D o alcune semplici applicazioni demo 3D, è necessario eseguire l'illuminazione. Questo in genere significa che dovrai trasformare le posizioni e le normali in uno spazio del mondo o della telecamera (vista), quindi eseguire alcune operazioni di illuminazione su di esse (nel vertex shader o nello shader del frammento).

Non è possibile farlo se si passa dallo spazio modello allo spazio di proiezione. Non puoi fare illuminazione nello spazio di post-proiezione, perché quello spazio non è lineare. La matematica diventa molto più complicata.

Quindi, punto 2: è necessario almeno uno stop tra modello e proiezione.

Quindi abbiamo bisogno di almeno 2 matrici. Perché il modello alla macchina da presa anziché il modello al mondo? Perché working in world space in shaders is a bad idea. È possibile riscontrare problemi di precisione numerica relativi a traduzioni lontane dall'origine. Considerando che, se hai lavorato nello spazio della fotocamera, non dovresti incontrare questi problemi, perché nulla è troppo lontano dalla fotocamera (e se lo è, dovrebbe probabilmente essere al di fuori del piano di profondità).

Pertanto: utilizziamo lo spazio della fotocamera come spazio intermedio per l'illuminazione.

+2

Illuminazione, ovviamente! Non pensavo affatto all'illuminazione. Questo probabilmente perché non ho mai scritto un proprio shader che esegua qualsiasi illuminazione finora. Il fatto che non si possa fare l'illuminazione nello spazio di proiezione sembra piuttosto logico. – Mecki

+0

Inoltre, le operazioni matrice per matrice sulla GPU sono * MOLTO * veloci - iirc, hanno hardware dedicato che lo implementa in parallelo, quindi un multiplo completo 4x4 4x4 ha lo stesso costo di una singola istruzione MAD (alcuni cicli di clock nel peggiore dei casi). Ti conviene badare ai feticci della trama, che sono i veri e propri colli di bottiglia. – imallett

+3

@Ian: Non ha senso; non esiste uno speciale hardware multiplo matrice matrix. Ci vorranno 16 cicli per una moltiplicazione 4x4 * 4x4. Ma va bene visto che non dovresti averlo comunque bisogno. Se stai solo trasformando i vettori (posizioni o direzioni), allora hai solo bisogno di fare moltiplicazione matrice/vettore, che richiede 4 cicli. –

2

Nella maggior parte dei casi lo shader richiede la geometria delle coordinate del mondo o degli occhi per l'ombreggiatura, quindi è necessario separare la matrice di proiezione dal modello e visualizzare le matrici.

Fare dello shader moltiplicare la geometria con due matrici fa male le prestazioni. Supponendo che ogni modello abbia vertici (o più) di gradienti, è più efficiente calcolare una matrice di vista del modello nella CPU una volta e lasciare che lo shader esegua una moltiplicazione di mtrix-vettore in meno.

Problemi correlati