Condividi tramite


Rappresentazione di PRT con trame (Direct3D 9)

Il simulatore PRTDemo e PRTCmdLine incluso nell'SDK DirectX rappresentano vettori di trasferimento ai vertici di una mesh. Per rappresentare il segnale PRT in modo accurato, questo può richiedere tessellazioni che potrebbero essere impraticabili per i giochi correnti. La rappresentazione dei vettori di trasferimento nelle mappe di trama è un approccio alternativo con lo stesso costo dei dati indipendentemente dalla complessità della mesh. Esistono diversi modi per generare mappe della trama vettore di trasferimento usando la libreria PRT D3DX.

Precomputing dei vettori di trasferimento

Un approccio consiste nel modificare gli esempi PRTDemo e PRTCmdLine per calcolare un vettore di trasferimento in ogni texel in una parametrizzazione di una superficie. Per eseguire questa operazione:

  1. Modificare la chiamata a D3DXCreatePRTEngine per estrarre le coordinate della trama dalla mesh (ExtractUV deve essere TRUE)
  2. Sostituire chiamate D3DXCreatePRTBuffer con D3DXCreatePRTBufferTex usando le stesse dimensioni della trama.

Tutti i metodi ID3DXPRTEngine funzionano con simulazioni per texel tranne: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSSS e ComputeDirectLightingSHAdaptive. Anche se la simulazione dello spazio della trama genererà il risultato corretto, può spesso essere abbastanza lenta perché probabilmente sarà il calcolo dei vettori di trasferimento in una densità elevata.

Un altro approccio consiste nel calcolare una simulazione PRT adattiva per vertice (con coordinate di trama che verranno usate per i dati per texel) e quindi chiamare ID3DXPRTEngine::ResampleBuffer (usando un buffer di output creato usando D3DXCreatePRTBufferTex alla risoluzione appropriata). Ciò funziona con tutte le funzionalità D3DX PRT nell'SDK e può spesso essere molto più efficiente del calcolo diretto di un buffer di trasferimento per texel.

Calcoli di runtime

Se viene usato un singolo cluster, i risultati possono essere filtrati e mappati mip come qualsiasi altra trama e il pixel shader è identico al codice del vertex shader fornito con PRTDemo.

Se la compressione genera più cluster, non è possibile filtrare o mappare i dati perché gli indici di clustering non sono continui. Ecco alcune alternative per la gestione dei dati multi-cluster:

  • Eseguire tutto il filtro in pixel shader. Sfortunatamente, questo è generalmente impraticabile per motivi di prestazioni.
  • Se le trame sono a bassa risoluzione non mappate a mip (ovvero mappe luminose), è più probabile che sia più efficiente calcolare l'illuminazione direttamente nello spazio della trama, dove non si verificherà alcun filtro e rendere l'oggetto con una trama ombreggiata. Si tratta essenzialmente di una mappa dinamica della luce creata interamente sulla GPU.
  • Se viene usato un atlas di trama (vedere Uso di UVAtlas (Direct3D 9)), è possibile raggruppare manualmente la scena avendo tutti i vettori di trasferimento in un componente connesso nello spazio trama nello stesso cluster. In questo modo è possibile filtrare la trama perché tutti i texel accessibili sarebbero nello stesso cluster in base alla costruzione. L'ID del cluster per un determinato viso può essere propagato dal vertex shader.

Gli shader pixel hanno un numero molto inferiore di registri costanti che non possono essere indicizzati, quindi lo shader pixel è leggermente diverso dal vertex shader. L'archiviazione del lavoro per cluster in una trama dinamica a bassa risoluzione e l'uso dei carichi di trama sarebbe il modo più efficiente per eseguire il rendering quando si usano più cluster.

Trasferimento di radianza precompilate

Esempio di demo PRT

Simulatore PRT (prtcmdline.exe)