Bene, cos'è una mappa ombra? Una mappa d'ombra è una trama a cui i texel rispondono a una semplice domanda: a quale distanza dalla luce, lungo la direzione rappresentata dal texel, è occlusa la luce? Le coordinate delle trame sono generate usando vari mezzi di tessitura proiettivi, a seconda del particolare algoritmo di mappatura dell'ombra.
La trama proiettiva è semplicemente un modo di trasformare un oggetto nello spazio della trama (e sì, lo so che suona all'indietro. Ma è così che funziona). Gli algoritmi di mappatura dell'ombra utilizzano diversi tipi di trasformazioni. Ma alla fine, queste sono solo trasformazioni da uno spazio all'altro.
Quando si esegue il rendering della mappa ombra, si prendono i vertici della geometria e li si trasforma in una pipeline di rendering standard. Ma le matrici di videocamera e proiezione sono progettate per la posizione e la direzione della luce, non per la posizione e l'orientamento della vista.
Quando si esegue il rendering in avanti con una mappa ombra, si esegue il rendering normale dell'oggetto, trasformando i vertici nello spazio della telecamera di visualizzazione e attraverso la matrice di proiezione di visualizzazione. Tuttavia, trasformi anche i vertici attraverso la tua videocamera luminosa e le matrici di proiezione, passandoli come dati per vertice allo shader di frammenti. Li usa attraverso la trama proiettiva per accedere alla trama dell'ombra.
Ecco il punto importante. L'accesso alla trama proiettiva è progettato in modo tale che la posizione a cui accede sulla trama rappresenta la direzione tra quel punto sulla superficie (il punto che si sta renderizzando nello shader di frammento) e la luce. Pertanto, recupera il texel che rappresenta la profondità alla quale si verifica l'occlusione per il frammento reso.
Ma non c'è niente di speciale in questa pipeline. Non è necessario trasformare le posizioni dei vertici nella trama dell'ombra e passarle allo shader di frammenti. Potresti passare le posizioni dei vertici dello spazio mondiale allo shader di frammenti, e poi far sì che lo shader di frammenti li trasformi nello spazio proiettivo della trama dell'ombra. Certo, avresti buttato via un sacco di prestazioni, dal momento che otterrai le stesse identiche coordinate di trama. Ma è matematicamente praticabile.
In effetti, è possibile passare le posizioni dei vertici della camera-spazio della vista allo shader del frammento. Potrebbe poi trasformarli in un mondo, quindi in uno spazio luminoso per la fotocamera, quindi in uno spazio proiettivo di ombreggiatura. Potresti mettere tutta quella trasformazione in una matrice (a seconda dell'algoritmo di proiezione ombra). Ancora una volta, questo ti dà esattamente quello che avevi prima, quindi quando si esegue il rendering in avanti, non c'è motivo di farlo.
Ma nel rendering posticipato , hai già le posizioni dei vertici della camera-spazio di visualizzazione. Devi, altrimenti non puoi fare l'illuminazione. O hai sprecato un sacco di memoria e larghezza di banda scrivendoli su un buffer, oppure eri intelligente e li hai ricalcolati usando il buffer di profondità e vari calcoli (che non entrerò qui, ma è coperto online).
In entrambi i casi, è possibile visualizzare le posizioni dello spazio della telecamera. E, come detto sopra, possiamo applicare una matrice per trasformarli dalla vista dello spazio della videocamera allo spazio di trama proiettiva dell'ombra. Quindi ... fallo. Quindi accedi alla tua mappa delle ombre.
Problema risolto.