Zustandsobjekte (Direct3D 10)

In Direct3D 10 wird der Gerätestatus in Zustandsobjekte gruppiert, was die Kosten für Zustandsänderungen erheblich reduziert. Es gibt mehrere Zustandsobjekte, und jedes ist so konzipiert, dass ein Satz von Zustand für eine bestimmte Pipelinephase initialisiert wird. Sie können bis zu 4096 von jedem Typ von Zustandsobjekten erstellen.

Input-Layout Staat

Diese Zustandsgruppe (siehe D3D10_INPUT_ELEMENT_DESC) gibt vor, wie die Eingabe-Assembler-Phase Daten aus den Eingabepuffern liest und zur Verwendung durch den Vertex-Shader zusammenfügt. Dies schließt den Zustand ein, z. B. die Anzahl der Elemente im Eingabepuffer und die Signatur der Eingabedaten. Die Input-Assembler-Phase ist eine neue Phase in der Pipeline, deren Aufgabe darin besteht, Primitive aus dem Arbeitsspeicher in die Pipeline zu streamen.

Informationen zum Erstellen eines eingabe-layout-state-Objekts finden Sie unter CreateInputLayout.

Rasterungsstatus

Diese Statusgruppe (siehe D3D10_RASTERIZER_DESC) initialisiert die Rasterisierungsphase. Dieses Objekt umfasst Zustandsmodi wie Füll- oder Cull-Modi, aktivieren ein Scherenrechteck für das Ausschneiden und Festlegen von Multisampelparametern. Diese Phase rastert Primitive in Pixel und führt Vorgänge wie Das Ausschneiden und Zuordnen von Primitiven zum Viewport aus.

Informationen zum Erstellen eines Rasterizer-Zustandsobjekts finden Sie unter CreateRasterizerState.

Depth-Stencil Staat

Diese Zustandsgruppe (siehe D3D10_DEPTH_STENCIL_DESC) initialisiert den Tiefenschablonenteil der Ausgabefusionsphase. Genauer gesagt initialisiert dieses Objekt tiefen- und Schablonentests.

Informationen zum Erstellen eines Tiefenschablonenzustandsobjekts finden Sie unter CreateDepthStencilState.

Mischzustand

Diese Zustandsgruppe (siehe D3D10_BLEND_DESC) initialisiert den Mischteil der Ausgabefusionsphase.

Informationen zum Erstellen eines Mischzustandsobjekts finden Sie unter CreateBlendState.

Samplerstatus

Diese Statusgruppe (siehe D3D10_SAMPLER_DESC) initialisiert ein Samplerobjekt. Ein Samplerobjekt wird von den Shaderphasen verwendet, um Texturen im Arbeitsspeicher zu filtern.

Unterschiede zwischen Direct3D 9 und Direct3D 10:

  • In Direct3D 10 ist das Samplerobjekt nicht mehr an eine bestimmte Textur gebunden, es beschreibt nur, wie die Filterung bei einer angefügten Ressource ausgeführt wird.

 

Informationen zum Erstellen eines Samplerzustandsobjekts finden Sie unter CreateSamplerState.

Überlegungen zur Leistung

Durch das Entwerfen der API für die Verwendung von Zustandsobjekten ergeben sich mehrere Leistungsvorteile. Dazu gehören das Überprüfen des Zustands zur Objekterstellungszeit, das Aktivieren der Zwischenspeicherung von Zustandsobjekten in der Hardware und eine deutliche Reduzierung der Zustandsmenge, die während eines API-Aufrufs mit Statuseinstellung übergeben wird (indem ein Handle an das Zustandsobjekt anstelle des Zustands übergeben wird).

Um diese Leistungsverbesserungen zu erzielen, sollten Sie Ihre Zustandsobjekte erstellen, wenn Ihre Anwendung gestartet wird, weit vor der Renderschleife. Zustandsobjekte sind unveränderlich, d. h. nach ihrer Erstellung können Sie sie nicht mehr ändern. Stattdessen müssen Sie sie zerstören und neu erstellen. Um diese Einschränkung zu bewältigen, können Sie bis zu 4096 von jedem Typ von Zustandsobjekten erstellen. Sie können beispielsweise mehrere Samplerobjekte mit verschiedenen Kombinationen aus Samplerzustand erstellen. Das Ändern des Samplerzustands erfolgt dann durch Aufrufen der entsprechenden Set-API, die ein Handle an das Objekt übergibt (im Gegensatz zum Samplerzustand). Dadurch wird der Mehraufwand während jedes Renderframes für den sich ändernden Zustand erheblich reduziert, da die Anzahl der Aufrufe und die Datenmenge erheblich reduziert werden.

Alternativ können Sie das Effektsystem verwenden, das die effiziente Erstellung und Zerstörung von Zustandsobjekten für Ihre Anwendung automatisch verwaltet.

API-Features (Direct3D 10)