Esporta (0) Stampa
Espandi tutto
Informazioni
L'argomento richiesto è visualizzato di seguito, ma non è incluso in questa libreria.
Questo argomento non è stato ancora valutato - Valuta questo argomento

Implementazione di buffer ombreggiatura per la funzionalità Direct3D di livello 9 (DirectX e C++)

Per sviluppare un'app di Windows Store utilizzando DirectX con C++ che esegue il rendering di effetti ombreggiatura e utilizza una funzionalità Direct3D di livello 9_1, 9_2 o 9_3, devi utilizzare un subset specifico di funzionalità di buffer ombreggiatura Direct3D 10_0+ per implementare correttamente gli effetti ombreggiatura. Di seguito viene illustrata l'implementazione di buffer ombreggiatura per la funzionalità Direct3D di livello 9.

Che cos'è un buffer ombreggiatura?

Le ombreggiature sono un elemento importante per creare una scena 3D realistica e dare un'illusione convincente della profondità. La tecnica del buffer ombreggiatura è un approccio comune per il rendering delle ombreggiature tramite hardware grafico, ma richiede anche costi elevati in termini di risorse. I buffer ombreggiatura sono implementati utilizzando un buffer profondità per archiviare le informazioni di profondità della scena dalla prospettiva della sorgente luminosa e confrontare quindi ogni punto sottoposto a rendering della scena con il buffer profondità per determinare se il punto è in ombra.

Implementazione di ombreggiature nella funzionalità Direct3D di livello 9_1, 9_2 o 9_3

All'avvio dell'app, chiama ID3D11Device::CheckFeatureSupport utilizzando il valore di enumerazione della funzionalità Direct3D D3D11_FEATURE_D3D9_SHADOW_SUPPORT per determinare se il driver grafico installato supporta i buffer ombreggiatura. Se i dati (la struttura corrispondente D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT) ricevuti dal parametro pFeatureSupportData di CheckFeatureSupport hanno il campo SupportsDepthAsTextureWithLessEqualComparisonFilter impostato su false, i buffer ombreggiatura non funzioneranno nell'app di Windows Store che usa DirectX quando è in esecuzione sul computer dell'utente. Per correggere questo problema, gli utenti devono aggiornare il driver in uso.



D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT d3d9ShadowSupportResults;
ZeroMemory(&d3d9ShadowSupportResults, sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)); 

m_device->CheckFeatureSupport(
		D3D11_FEATURE_D3D9_SHADOW_SUPPORT, 
		&d3d9ShadowSupportResults,
		sizeof(D3D11_FEATURE_DATA_D3D9_SHADOW_SUPPORT)
		);
	

Questa tecnica funziona con buffer profondità a 16 bit o a 24 bit, entrambi presentati nella sezione delle osservazioni. Ricorda che alcune implementazioni del driver potrebbero supportare solo i buffer profondità a 16 bit.

Nota  Per ulteriori informazioni, leggi Tecniche comuni per migliorare le mappe con profondità di ombreggiatura.

  1. Crea una risorsa di superficie Texture2D (tramiteID3D11Device::CreateTexture2D) con il campo Format di D3D11_TEXTURE2D_DESC impostato su DXGI_FORMAT_R24G8_TYPELESS se i buffer profondità a 24 bit sono supportati oppure DXGI_FORMAT_R16_TYPELESS in caso contrario. Specifica i valori dei flag BIND_SHADER_RESOURCE e BIND_DEPTH_STENCIL anche nel campoBindFlags. In questo modo, la superficie può essere utilizzata come buffer profondità o come trama in passaggi di rendering separati.

    Nota  Non utilizzare CheckFormatSupport per scoprire se il driver grafico supporta questi formati specifici. Se utilizzi le API Direct3D 11 CheckFeatureSupport e CheckFormatSupport per ottenere informazioni sul supporto di DXGI_FORMAT per la funzionalità di livello 9_*, il runtime di DirectX non segnalerà il supporto per alcuna funzionalità di buffer ombreggiatura.

  2. Utilizzando un formato di profondità come DXGI_FORMAT_D24_UNORM_S8_UINT per la profondità di buffer ombreggiatura a 24 bit o DXGI_FORMAT_D16_UNORM per la profondità di buffer ombreggiatura a 16 bit, crea ID3D11DepthStencilView (using ID3D11Device::CreateDepthStencilView) nella risorsa Texture2D allocata al passaggio 1.

  3. Carica il buffer ombreggiatura con le informazioni di ombreggiatura. Innanzitutto, imposta una fotocamera temporanea in corrispondenza della sorgente luminosa e rivolta nella stessa direzione. Esegui quindi il rendering di tutti gli oggetti nella scena che possono proiettare ombre su loro stessi o su altri oggetti. Per questo passaggio, non impostare un pixel shader ed esegui solo il binding di ID3D11DepthStencilView per l'output.

  4. Per eseguire il rendering di oggetti nella scena con le ombre, crea oggetti stato del campionatore con il filtro di confronto impostato. La modalità di confronto deve essere impostata su LessEqual per i dispositivi con funzionalità di livello 9_*. In questo campionatore di profondità è anche consentito l'indirizzamento di BorderColor anche se BorderColor non è in genere supportato nella funzionalità Direct3D di livello 9_1 e 9_2 dalla maggior parte dei driver grafici. Utilizzando il colore del bordo, è possibile determinare se le aree esterne alla mappa delle ombreggiature risultino essere sempre o mai in ombra impostando il valore di BorderColor su 0.0 o 1.0, rispettivamente.

    La qualità del filtro di ombreggiatura è controllata dalle opzioni di filtro Mag e Min nel campionatore di confronto. Il campionamento a punti produce ombreggiature con bordi con alias. Le impostazioni del campionatore a filtro lineare garantiscono bordi delle ombreggiature di migliore qualità, ma possono influire negativamente sulle prestazioni di dispositivi ottimizzati per il risparmio energetico.

    Nota   Di seguito sono presentati alcuni punti da considerare. Innanzitutto, l'utilizzo di un'impostazione separata per le opzioni di filtro Mag e Min danno un risultato non definito. Inoltre, il filtro anisotropo non è supportato. Infine, la funzionalità Direct3D di livello 9_* non supporta i buffer profondità mappati MIP.

  5. Crea ID3D11ShaderResourceView (utilizzando ID3D11Device::CreateShaderResourceView) per la risorsa Texture2D allocata al passaggio 1 ed eseguirne il binding al campionatore di confronto descritto in precedenza. Come al passaggio 1, devi impostare il formato di pixel per questa visualizzazione su DXGI_FORMAT_R24_UNORM_G8_TYPELESS per la profondità a 24 bit o su DXGI_FORMAT_R16_UNORM per la profondità a 16 bit.

  6. Crea e imposta un pixel shader ps_4_0_level_9_* per il passaggio di applicazione dell'ombreggiatura. Deve calcolare la posizione di ogni pixel in relazione alla posizione della sorgente luminosa e confrontare il valore z del pixel al valore del buffer ombreggiatura per determinare se tale pixel è in ombra. A tale scopo, scrivi il codice di shader per quanto segue (con il passaggio di confronto eseguito dall'hardware):

    • Innanzitutto, le coordinate di trama e il valore z si ottengono proiettando la posizione corrente nello stesso mondo, nella stessa visualizzazione e nello stesso spazio di proiezione utilizzati per il rendering dell'ombreggiatura, quindi rimappare le coordinate x-y dallo spazio [-1..1] allo spazio [0..1] per il campionamento della mappa delle ombreggiature.
    • Successivamente, le coordinate di trama e il valore z si ottengono proiettando la posizione corrente nello stesso mondo, nella stessa visualizzazione e nello stesso spazio di proiezione utilizzati per il rendering dell'ombreggiatura, quindi rimappare le coordinate x-y dallo spazio [-1..1] allo spazio [0..1] per il campionamento della mappa delle ombreggiature.
    • Quindi, per determinare la quantità di ombra per il pixel corrente, utilizza i metodi SampleCmp e SampleCmpLevelZero Texture2D per ottenere i campioni da ID3D11ShaderResourceView creato al passaggio 5, come se utilizzassi la funzionalità Direct3D di livello 10_0 e superiore. Il risultato è la frazione dei campioni non in ombra per il filtro lineare, specificati come valori nell'intervallo [0..1]. Per il campionamento a punti, viene restituito un valore di 0.0 o 1.0.

    Nota  Nella funzionalità Direct3D di livello 9_1, 9_2 e 9_3, i tentativi di compilare uno shader con gli intrinseci SampleCmp* utilizzando un compilatore HLSL precedente (ad esempio la versione Windows 7 del metodo ID3D11Device::CreatePixelShader) hanno esito negativo. Gli intrinseci SampleCmp* sono supportati solo nel compilatore fxc e nella DLL associata fornita a partire da Windows 8. Questi intrinseci HLSL sono anche presenti nei modelli di shader per la funzionalità Direct3D di livello superiore a 9.

  7. Eseguire il rendering degli oggetti nella scena con ombreggiature proiettate su di essi.

Ricorda di pulire lo stato dell'API dopo il rendering con le ombreggiature. In un dispositivo con un livello di funzionalità configurato pari a 9_1, se lo stato dell'API non corrisponde, la chiamata a ID3D11DeviceContext::Draw viene ignorata. Ad esempio, se il renderer esegue il binding di una trama (profondità o altro) mentre il campionatore corrispondente rimane configurato per il campionamento di confronto, ID3D11DeviceContext::Draw viene ignorato. In questo caso, lo stato dell'API è impostato in modo errato.

Implementazione di ombreggiature nella funzionalità Direct3D di livello 10_0 o superiore

I passaggi precedenti per il mapping delle ombreggiature nei dispositivi con funzionalità di livello 9 sono applicabili ugualmente ai dispositivi con funzionalità di livello 10 o superiore, senza necessità di modificare il codice. I livelli di funzionalità più elevati, tuttavia, supportano una gamma più ampia di opzioni, tra cui modalità di confronto avanzate e formati aggiuntivi di superficie dell'ombreggiatura.

Argomenti correlati

Tecniche comuni per migliorare le mappe di profondità delle ombreggiature
Funzionalità Direct3D di livello 11
Sviluppo per diversi livelli di funzionalità Direct3D

 

 

Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.
Mostra:
© 2014 Microsoft. Tutti i diritti riservati.