Dovrei usare una matrice mondiale?


8

Riferimento immagine per la domanda:

spazio oggetto vs spazio mondo

(immagine dal tutorial CG )

L'API D3D9 ci ha abituati alle matrici mondiali .

Tuttavia, se usi matrici mondiali, devi fare una moltiplicazione di matrice aggiuntiva nello shader (che finisce per essere lo stesso per molti vertici).

Da qui la convenzione OpenGL di concatenare la modellazione e la visualizzazione di matrici in una matrice (GL_MODELVIEWMATRIX = View * World).

Cosa c'è di meglio e perché?

Risposte:


7

No. Non dovresti mai avere una matrice mondiale esplicita nel tuo shader.

Una spiegazione dettagliata del perché può essere trovata qui , ma la versione breve è davvero molto semplice: non ne hai mai bisogno e può uccidere la tua precisione in virgola mobile.

Se lo spazio del tuo mondo è troppo grande, una fotocamera lontana dall'origine può causare problemi di precisione in virgola mobile.

Tutto lo spazio del mondo non è altro che un intermediario tra lo spazio modello e lo spazio della telecamera. È un posto dove puoi esprimere la fotocamera e tutti gli altri oggetti nello stesso spazio. Ma tutto ciò per cui lo usi è generare una matrice da mondo a fotocamera, che poi applichi a tutte le matrici da modello a mondo per creare matrici da modello a fotocamera.

È possibile gestire i problemi di precisione in C ++ utilizzando doppi invece di float per i calcoli di matrice. Puoi riconvertirli in float prima di caricarli nello shader.

Quindi perché mai avresti bisogno di una trasformazione esplicita dello spazio mondiale nel tuo shader? Nel tuo codice sorgente, sì. Ma nel tuo shader? Cosa faresti con esso che non puoi fare con lo spazio della fotocamera?

L'illuminazione può essere eseguita nello spazio della fotocamera con la stessa facilità con cui si utilizza lo spazio mondiale; tutto quello che devi fare è trasformare le posizioni / direzioni della luce nello spazio della telecamera. Dopotutto, lo spazio della telecamera ha la stessa scala dello spazio mondiale. Questa trasformazione viene eseguita una volta per fotogramma per luce; difficilmente un onere prestazionale anche sulla CPU.

Quindi non ha assolutamente senso esporre i tuoi shader a una esplicita trasformazione dello spazio nel mondo. È solo un passaggio intermedio che pieghi nelle tue matrici.


1

Non dovresti moltiplicare la matrice extra nel tuo shader. Il trucco è che esegui la moltiplicazione della matrice una volta per frame sulla CPU, quindi carica il risultato finale sul tuo shader di vertice. Questo ti dà una posizione per moltiplicazione di matrice per vertice, indipendentemente dal fatto che tu abbia il mondo e visualizzi separato o concatenato.


0

In molti casi, vuoi avere il mondo in posa nello shader di vertice comunque, per altri scopi. Ad esempio, è necessario calcolare il vettore della vista, per passare al pixel shader per valutare speculare.

La matrice da locale a mondo è anche necessaria per trasformare i vettori tangenti e i vettori normali [1] nello spazio mondiale per l'ombreggiatura, supponendo che tu faccia l'ombreggiatura nello spazio mondiale (potresti farlo nello spazio tangente, nel qual caso avresti bisogno un diverso set di matrici).

Quindi, IMO, ha senso avere due matrici: local-to-world e world-to-clip. Quest'ultimo è il prodotto della matrice di visualizzazione e della matrice di proiezione. Passa entrambi allo shader di vertice e fai le moltiplicazioni come:

posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

[1] (Fintanto che non si ha un ridimensionamento non uniforme. In tal caso, le normali devono essere trasformate dalla trasposizione inversa della matrice da locale a mondo.)


-1: lo spazio mondiale è cattivo. Molto brutto; non dovresti usarlo negli shader
Nicol Bolas,

@NicolBolas: buon punto; ci sono problemi di precisione con l'ombreggiatura nello spazio mondiale. Non significa che devi usare lo spazio della fotocamera. Nel mio lavoro utilizziamo effettivamente uno "spazio mondiale incentrato sulla macchina fotografica": assi allineati al mondo, origine della macchina fotografica. Avere assi allineati al mondo semplifica l'applicazione di cubemap che vengono archiviate nello spazio mondiale.
Nathan Reed,
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.