Freigeben über


Unterschiede zwischen Effekten 10 und Effekten 11

In diesem Thema werden die Unterschiede zwischen Effekten 10 und Effekt 11 gezeigt.

Gerätekontexte, Threading und Klonen

Die ID3D10Device-Schnittstelle wurde in Direct3D 11 in zwei Schnittstellen unterteilt: ID3D11Device und ID3D11DeviceContext. Sie können mehrere ID3D11DeviceContexts erstellen, um gleichzeitige Ausführung in mehreren Threads zu vereinfachen. Effects 11 erweitert dieses Konzept auf das Effects-Framework.

Die Effects 11-Laufzeit ist singlethreaded. Aus diesem Grund sollten Sie keine einzelne ID3DX11Effect-Instanz mit mehreren Threads gleichzeitig verwenden.

Um die Effects 11-Laufzeit für mehrere Instanzen zu verwenden, müssen Sie separate ID3DX11Effect-Instanzen erstellen. Da der ID3D11DeviceContext auch singlethreaded ist, sollten Sie unterschiedliche ID3D11DeviceContext-Instanzen an jede Effektinstanz auf Apply übergeben. Sie können diese separaten Gerätekontexte verwenden, um Befehlslisten zu erstellen, damit der Renderingthread sie auf den unmittelbaren Gerätekontext anwenden kann.

Die einfachste Möglichkeit zum Erstellen mehrerer Effekte, die dieselbe Funktionalität kapseln, für die Verwendung in mehreren Threads, besteht darin, einen Effekt zu erstellen und dann geklonte Kopien zu erstellen. Das Klonen hat die folgenden Vorteile gegenüber dem Erstellen mehrerer Kopien von Grund auf:

  1. Die Klonroutine ist schneller als die Erstellungsroutine.
  2. Geklonte Effekte teilen erstellte Shader, Statusblöcke und Klasseninstanzen (sodass sie nicht neu erstellt werden müssen).
  3. Geklonte Effekte können Konstantenpuffer gemeinsam nutzen.
  4. Geklonte Effekte beginnen mit dem Zustand, der dem aktuellen Effekt entspricht (Variablenwerte, unabhängig davon, ob sie optimiert wurden).

Weitere Informationen finden Sie unter Klonen eines Effekts.

Effektpools und Gruppen

Bisher war die häufigste Verwendung von Effektpools in Direct3D 10 für Gruppierungsmaterialien vorgesehen. Effektpools wurden aus Effekten 11 entfernt, und Gruppen wurden hinzugefügt, was eine effizientere Methode zum Gruppieren von Materialien ist.

Eine Effektgruppe ist einfach eine Reihe von Techniken. Weitere Informationen finden Sie unter Effektgruppensyntax (Direct3D 11).

Betrachten Sie die folgende Effekthierarchie mit vier untergeordneten Effekten und einem Effektpool:

// 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 { ... }

Sie können dieselbe Funktionalität in Effects 11 mithilfe von Gruppen erreichen:

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

Neue Shaderstufen

In Direct3D 11 gibt es drei neue Shaderphasen: den Hull-Shader, den Domänen-Shader und den Compute-Shader. Effekte 11 behandelt diese auf ähnliche Weise wie Vertex-Shader, Geometrie-Shader und Pixelshader.

Zu Effekt 11 wurden drei neue Variablentypen hinzugefügt:

  • HullShader
  • DomainShader
  • ComputeShader

Wenn Sie diese Shader in einer Technik verwenden, müssen Sie diese Technik "technique11" und nicht "technique10" bezeichnen. Der Compute-Shader kann nicht im gleichen Pass wie jeder andere Grafikzustand (andere Shader, Zustandsblöcke oder Renderziele) festgelegt werden.

Neue Texturtypen

Direct3D 11 unterstützt die folgenden Texturtypen:

Nicht angeordnete Zugriffsansichten

Effects 11 unterstützt das Abrufen und Festlegen der neuen ungeordneten Zugriffsansichtstypen. Dies funktioniert ähnlich wie Texturen.

Betrachten Sie dieses HlSL-Beispiel für Effekte:

  
RWTexture1D<float> myUAV;

Sie können diese Variable in C++ wie folgt festlegen:

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11 unterstützt die folgenden ungeordneten Zugriffsansichtstypen:

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Schnittstellen und Klasseninstanzen

Informationen zur Schnittstellen- und Klassensyntax finden Sie unter Schnittstellen und Klassen.

Informationen zum Verwenden von Schnittstellen und Klassen in Effekten finden Sie unter Schnittstellen und Klassen in Effects.

Adressierbarer Stream out

In Direct3D 10 konnten Geometrie-Shader einen Datenstrom an die Datenausgabeeinheit und die Rasterizereinheit ausgeben. In Direct3D11 können Geometrie-Shader bis zu vier Datenströme an die Datenstromausgabeeinheit ausgeben, und höchstens einen dieser Datenströme an die Rasterizereinheit. Die ConstructGSWithSO systemintern wurde aktualisiert, um diese neue Funktionalität widerzuspiegeln.

Weitere Informationen finden Sie unter StreamOutsyntax.

Festlegen und Aufheben des Gerätestatus

In Effects 10 können Sie Konstantenpuffer und Texturpuffer mithilfe der funktionen ID3D10EffectConstantBuffer::SetConstantBuffer und SetTextureBuffer erstellen. Nachdem Sie diese Funktionen aufgerufen haben, verwaltet die Effects 10-Laufzeit den Konstantenpuffer oder Texturpuffer nicht mehr, und der Benutzer muss die Daten mithilfe der ID3D10Device-Schnittstelle ausfüllen.

In Effects 11 können Sie die Zustandsblöcke (Blend-Zustand, Rasterizerzustand, Tiefenschablonenzustand und Samplerstatus) auch mithilfe der folgenden Aufrufe verwalten:

Nachdem Sie diese Funktionen aufgerufen haben, verwaltet die Effects 11-Laufzeit die Zustandsblockvariablen nicht mehr, und es bleiben werte unverändert. Da Statusblöcke unveränderlich sind, muss der Benutzer einen neuen Statusblock festlegen, um die Werte zu ändern.

Sie können auch Konstantenpuffer, Texturpuffer und Zustandsblöcke auf den nicht vom Benutzer verwalteten Zustand zurücksetzen. Wenn Sie diese Variablen nicht festlegen, wird die Effects 11-Laufzeit bei Bedarf weiterhin aktualisiert. Sie können die folgenden Aufrufe für nicht festgelegte vom Benutzer verwaltete Variablen verwenden:

Virtueller Effektcomputer

Der virtuelle Effektcomputer, der komplexe Ausdrücke außerhalb von Funktionen ausgewertet hat, wurde entfernt.

Die folgenden Beispiele für komplexe Ausdrücke werden nicht unterstützt:

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

Die folgenden Beispiele für nicht komplexe Ausdrücke werden unterstützt:

  1. SetPixelShader( myPS);
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex ist eine uint-Variable
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Diese Ausdrücke können in Zustandsblockausdrücken (z. B. FILTER) und Übergeben von Ausdrücken (z. B. SetPixelShader) angezeigt werden.

Quellverfügbarkeit und -speicherort

Effekte 10 wurde in D3D10.dllverteilt. Effects 11 wird als Quelle mit entsprechenden Visual Studio-Lösungen verteilt, um sie zu kompilieren. Beim Erstellen von Effekttypanwendungen wird empfohlen, die Effects 11-Quelle direkt in diese Anwendungen aufzunehmen.

Sie können Effekte 11 von Effects für Direct3D 11 Updateabrufen.

Effects (Direct3D 11)