Unterschiede zwischen Effekten 10 und Effekten 11

In diesem Thema werden die Unterschiede zwischen Effekten 10 und Effekten 11 erläutert.

Gerätekontexte, Threading und Klonen

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

Die Effects 11-Runtime ist singlethreaded. Aus diesem Grund sollten Sie keinen einzelnen ID3DX11Effect-instance mit mehreren Threads gleichzeitig verwenden.

Um die Effects 11-Runtime auf mehreren Instanzen zu verwenden, müssen Sie separate ID3DX11Effect-Instanzen erstellen. Da ID3D11DeviceContext auch Singlethreads ist, sollten Sie unterschiedliche ID3D11DeviceContext-Instanzen an jeden Effekt übergeben, instance auf Apply. 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 die gleiche 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, Zustandsblöcke und Klasseninstanzen (sie müssen also nicht neu erstellt werden).
  3. Geklonte Effekte können konstanten Puffer gemeinsam nutzen.
  4. Geklonte Effekte beginnen mit dem Zustand, der mit dem aktuellen Effekt übereinstimmt (Variablenwerte, unabhängig davon, ob er optimiert wurde oder nicht).

Weitere Informationen finden Sie unter Klonen eines Effekts .

Effektpools und -gruppen

Die bei weitem am häufigsten verwendete Wirkungspools in Direct3D 10 war zum Gruppieren von Materialien. Effektpools wurden aus Effects 11 entfernt, und Gruppen wurden hinzugefügt, was eine effizientere Methode zum Gruppieren von Materialien ist.

Eine Effektgruppe besteht einfach aus einer 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 die gleiche 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 Shaderstufen: Hull-Shader, Domänen-Shader und Compute-Shader. Effects 11 behandelt diese auf ähnliche Weise wie Vertexshader, Geometry-Shader und Pixelshader.

In Effects 11 wurden drei neue Variablentypen hinzugefügt:

  • HullShader
  • DomainShader
  • ComputeShader

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

Neue Texturtypen

Direct3D 11 unterstützt die folgenden Texturtypen:

Ungeordnete Zugriffsansichten

Effects 11 unterstützt das Abrufen und Festlegen der neuen Typen von ungeordneten Zugriffsansichten. Dies funktioniert auf ähnliche Weise wie Texturen.

Sehen Sie sich das folgende Effekt-HLSL-Beispiel an:

  
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 Effekten.

Adressierbarer Stream out

In Direct3D 10 können Geometrieshader einen Datenstrom an die Streamausgabeeinheit und die Rasterizereinheit ausgeben. In Direct3D11 können Geometry-Shader bis zu vier Datenströme an die Streamausgabeeinheit und höchstens einen dieser Datenströme an die Rasterizereinheit ausgeben. Das systeminterne ConstructGSWithSO wurde aktualisiert, um diese neue Funktionalität widerzuspiegeln.

Weitere Informationen finden Sie unter Stream Out-Syntax .

Festlegen und Deaktivieren des Gerätestatus

In Effects 10 können Sie konstanten Puffer und Texturpuffer mithilfe der Funktionen ID3D10EffectConstantBuffer::SetConstantBuffer und SetTextureBuffer vom Benutzer verwalten. Nachdem Sie diese Funktionen aufgerufen haben, verwaltet die Effects 10-Runtime den Konstantenpuffer oder Texturpuffer nicht mehr, und der Benutzer muss die Daten mithilfe der ID3D10Device-Schnittstelle füllen.

In Effekt 11 können Sie auch die Zustandsblöcke (Blendzustand, Rasterizerzustand, Tiefenschablonenzustand und Samplerzustand) mithilfe der folgenden Aufrufe benutzerseitig verwalten:

Nachdem Sie diese Funktionen aufgerufen haben, verwaltet die Effects 11-Laufzeit die Zustandsblockvariablen nicht mehr, und die Werte bleiben unverändert. Beachten Sie, dass der Benutzer einen neuen Zustandsblock festlegen muss, um die Werte zu ändern, da Zustandsblöcke unveränderlich sind.

Sie können auch konstanten Puffer, Texturpuffer und Zustandsblöcke in den nicht vom Benutzer verwalteten Zustand rückgängig machen. Wenn Sie das Festlegen dieser Variablen aufheben, aktualisiert die Effects 11-Runtime sie bei Bedarf weiter. Sie können die folgenden Aufrufe verwenden, um vom Benutzer verwaltete Variablen zu aufheben:

Virtueller Computer mit Effekten

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 = ANISOTROP;

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

Quellverfügbarkeit und -speicherort

Die Effekte 10 wurden in D3D10.dll verteilt. Effects 11 wird als Quelle verteilt, mit entsprechenden Visual Studio-Projektmappen, um sie zu kompilieren. Beim Erstellen von Effektanwendungen wird empfohlen, die Effects 11-Quelle direkt in diese Anwendungen einzufügen.

Sie können Effects 11 über Effects for Direct3D 11 Update abrufen.

Effekte (Direct3D 11)