Condividi tramite


Differenze tra effetti 10 ed effetti 11

In questo argomento vengono illustrate 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 su 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é anche ID3D11DeviceContext è a thread singolo, è necessario passare istanze ID3D11DeviceContext diverse a ogni istanza dell'effetto su 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:

  1. La routine di clonazione è più veloce rispetto alla routine di creazione.
  2. Gli effetti clonati condividono shader, blocchi di stato e istanze di classe creati, pertanto non devono essere ricreati.
  3. Gli effetti clonati possono condividere buffer costanti.
  4. 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 di effetti e gruppi

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 dagli effetti 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 Effect Group Syntax (Direct3D 11).

Si consideri la gerarchia degli 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 elementi in modo simile a vertex shader, geometry shader e 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

Effects 11 supporta l'acquisizione 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 dell'interfaccia e della 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, gli shader geometry potrebbero restituire un flusso di dati all'unità di output del flusso e all'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à rasterizer. L'ConstructGSWithSO intrinseco è 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 delle trame gestiti dall'utente usando le funzioni ID3D10EffectConstantBuffer::SetConstantBuffer e SetTextureBuffer. Dopo aver chiamato queste funzioni, il runtime 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 impostare i blocchi di stato (stato blend, stato rasterizzatore, stato depth-stencil e stato campionatore) gestiti dall'utente usando le chiamate seguenti:

Dopo aver chiamato queste funzioni, il runtime 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 delle trame e i blocchi di stato allo stato non 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:

Macchina virtuale Effetti

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:

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i );
  3. FILTER = i + 2;

Sono supportati gli esempi seguenti di espressioni non complesse:

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex è una variabile uint
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Queste espressioni possono essere visualizzate nelle espressioni di 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. Effects 11 viene distribuito come origine, con le soluzioni di Visual Studio corrispondenti per compilarlo. Quando si creano applicazioni di tipo effetti, è consigliabile includere direttamente l'origine Effects 11 in tali applicazioni.

È possibile ottenere Effetti 11 da Effects for Direct3D 11 Update.

effetti (Direct3D 11)