Differenze tra effetti 10 ed effetti 11
Questo argomento illustra le differenze tra Gli effetti 10 e Gli effetti 11.
Contesti di dispositivo, threading e clonazione
L'interfaccia ID3D10Device è stata suddivisa in due interfacce in Direct3D 11: ID3D11Device e ID3D11DeviceContext. È possibile creare più ID3D11DeviceContexts per facilitare l'esecuzione simultanea in più thread. Gli effetti 11 estendono questo concetto al framework Effects.
Il runtime effects 11 è a thread singolo. Per questo motivo, non è consigliabile usare una singola istanza ID3DX11Effect con più thread contemporaneamente.
Per usare il runtime effects 11 in più istanze, è necessario creare istanze ID3DX11Effect separate. Poiché id3D11DeviceContext è anche a thread singolo, è necessario passare istanze ID3D11DeviceContext diverse a ogni istanza dell'effetto in Apply. È possibile usare questi contesti di dispositivo separati per creare elenchi di comandi in modo che il thread di rendering possa applicarli nel contesto di dispositivo immediato.
Il modo più semplice per creare più effetti che incapsulano la stessa funzionalità, da usare su più thread, consiste nel creare un effetto e quindi creare copie clonate. La clonazione presenta i vantaggi seguenti rispetto alla creazione di più copie da zero:
- La routine di clonazione è più veloce della routine di creazione.
- Gli effetti clonati condividono gli shader, i blocchi di stato e le istanze di classe (quindi non devono essere ricreati).
- Gli effetti clonati possono condividere buffer costanti.
- Gli effetti clonati iniziano con lo stato corrispondente all'effetto corrente (valori variabili, indipendentemente dal fatto che sia stato ottimizzato o meno).
Per altre informazioni, vedere Clonazione di un effetto .
Pool e gruppi di effetti
Di gran lunga l'uso più diffuso di pool di effetti in Direct3D 10 era per il raggruppamento dei materiali. I pool di effetti sono stati rimossi da Effects 11 e sono stati aggiunti gruppi, che è un metodo più efficiente di raggruppamento dei materiali.
Un gruppo di effetti è semplicemente un set di tecniche. Per altre informazioni, vedere Sintassi del gruppo di effetti (Direct3D 11).
Si consideri la gerarchia di effetti seguente con quattro effetti figlio e un pool di effetti:
// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }
// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }
// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }
// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }
È possibile ottenere la stessa funzionalità in Effects 11 usando i gruppi:
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;
fxgroup GrassMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
fxgroup WaterMaterial
{
technique10 LowSpec { ... }
technique10 HighSpec { ... }
}
Nuove fasi shader
Esistono tre nuove fasi dello shader in Direct3D 11: hull shader, domain shader e compute shader. Gli effetti 11 gestiscono questi in modo simile ai vertex shader, ai geometry shader e ai pixel shader.
Sono stati aggiunti tre nuovi tipi di variabili a Effects 11:
- HullShader
- DomainShader
- ComputeShader
Se si usano questi shader in una tecnica, è necessario etichettare tale tecnica "tecnica11" e non "tecnica10". Non è possibile impostare lo shader di calcolo nello stesso passaggio di qualsiasi altro stato grafico (altri shader, blocchi di stato o destinazioni di rendering).
Nuovi tipi di trama
Direct3D 11 supporta i tipi di trama seguenti:
Viste di accesso non ordinate
Gli effetti 11 supportano il recupero e l'impostazione dei nuovi tipi di visualizzazione di accesso non ordinati. Questo funziona in modo simile alle trame.
Si consideri questo esempio di Effetti HLSL:
RWTexture1D<float> myUAV;
È possibile impostare questa variabile in C++ come indicato di seguito:
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );
Direct3D 11 supporta i tipi di visualizzazione di accesso non ordinati seguenti:
- RWBuffer
- RWByteAddressBuffer
- RWStructuredBuffer
- RWTexture1D
- RWTexture1DArray
- RWTexture2D
- RWTexture2DArray
- RWTexture3D
Interfacce e istanze di classe
Per la sintassi di interfaccia e classe, vedere Interfacce e classi.
Per l'uso di interfacce e classi in effetti, vedere Interfacce e classi in Effetti.
Streaming indirizzabile in uscita
In Direct3D 10, i geometry shader potrebbero restituire un flusso di dati nell'unità di output del flusso e nell'unità di rasterizzazione. In Direct3D11 gli shader geometry possono restituire fino a quattro flussi di dati nell'unità di output del flusso e al massimo uno di questi flussi all'unità di rasterizzazione. L'intrinseco ConstructGSWithSO è stato aggiornato per riflettere questa nuova funzionalità.
Per altre informazioni, vedere Sintassi di uscita di flusso .
Impostazione e annullamento dell'impostazione dello stato del dispositivo
In Effects 10 è possibile creare buffer costanti e buffer di trama gestiti dall'utente usando le funzioni ID3D10EffectConstantBuffer::SetConstantBuffer e SetTextureBuffer . Dopo aver chiamato queste funzioni, il runtime di Effects 10 non gestisce più il buffer costante o il buffer di trama e l'utente deve riempire i dati usando l'interfaccia ID3D10Device.
In Effetti 11 è anche possibile eseguire i blocchi di stato (stato di fusione, stato rasterizzatore, stato depth-stencil e stato del campionatore) gestiti dall'utente usando le chiamate seguenti:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
Dopo aver chiamato queste funzioni, il runtime di Effects 11 non gestisce più le variabili del blocco di stato e i valori rimarranno invariati. Si noti che poiché i blocchi di stato non sono modificabili, l'utente deve impostare un nuovo blocco di stato per modificare i valori.
È anche possibile ripristinare i buffer costanti, i buffer di trama e i blocchi di stato allo stato gestito dall'utente. Se si annulla l'impostazione di queste variabili, il runtime di Effects 11 continuerà ad aggiornarli quando necessario. È possibile usare le chiamate seguenti per annullare l'impostazione delle variabili gestite dall'utente:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Effetti macchina virtuale
La macchina virtuale degli effetti, che ha valutato espressioni complesse al di fuori delle funzioni, è stata rimossa.
Gli esempi seguenti di espressioni complesse non sono supportati:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Sono supportati gli esempi seguenti di espressioni non complesse:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex è una variabile uint
- FILTER = i;
- FILTER = ANISOTROPIC;
Queste espressioni possono essere visualizzate nelle espressioni del blocco di stato (ad esempio FILTER) e nelle espressioni pass (ad esempio SetPixelShader).
Disponibilità e posizione di origine
Gli effetti 10 sono stati distribuiti in D3D10.dll. Gli effetti 11 vengono distribuiti come origine, con le soluzioni di Visual Studio corrispondenti per compilarlo. Quando si creano applicazioni di tipo effetti, è consigliabile includere l'origine Effects 11 direttamente in tali applicazioni.
È possibile ottenere effetti 11 dagli effetti per l'aggiornamento Direct3D 11.
Argomenti correlati