Überlegungen zu Direct3D 9 zu Direct3D 10 (Direct3D 10)
Die folgende Seite enthält eine grundlegende Gliederung der wichtigsten Unterschiede zwischen Direct3D 9 und Direct3D 10. Die folgende Gliederung bietet einige Einblicke, um Entwicklern mit Direct3D 9-Erfahrung bei der Untersuchung und Beziehung zu Direct3D 10 zu helfen.
Obwohl die Informationen in diesem Thema Direct3D 9 mit Direct3D 10 vergleichen, da Direct3D 11 auf den Verbesserungen in Direct3D 10 und 10.1 basiert, benötigen Sie diese Informationen auch für die Migration von Direct3D 9 zu Direct3D 11. Informationen zum Verschieben von Direct3D 10 zu Direct3D 11 finden Sie unter Migrieren zu Direct3D 11.
- Übersicht über die wichtigsten strukturellen Änderungen in Direct3D 10
- Engineabstraktionen/Trennung
- Tricks zum schnellen Beheben von Anwendungsbuildproblemen
- Steuern der Direct3D 10-API
- Ressourcenerstellung
- Ansichten
- Statischer und dynamischer Ressourcenzugriff
- Direct3D 10-Effekte
- HLSL ohne Effekte
- Shaderkompilierung
- Erstellen von Shaderressourcen
- Schnittstelle zur Shaderreflektionsebene
- Layouts für Eingabeassemierer – Vertex-Shader/Eingabestromverknüpfung
- Auswirkungen der Entfernung von shader dead code
- Beispiel für die Vertex-Shader-Eingabestruktur
- Zustandsobjekterstellung
- Portieren von Texturen
- Portieren von Shadern
- Zusätzliche Direct3D 10-Unterschiede zur Überwachung
- Zusätzliche Direct3D 10.1-Unterschiede
- Zugehörige Themen
Übersicht über die wichtigsten strukturellen Änderungen in Direct3D 10
Das Rendern mit dem Direct3D 10-Gerät ähnelt strukturell dem Von Direct3D 9.
- Festlegen einer Vertexstreamquelle
- Festlegen des Eingabelayouts in Direct3D 10 (Festlegen der Vertexstreamdeklaration in Direct3D 9)
- Deklarieren der primitiven Topologie
- Festlegen von Texturen
- Festlegen von Zustandsobjekten
- Festlegen von Shadern
- Draw
Der Draw-Aufruf bindet die Vorgänge zusammen. Die Reihenfolge der Aufrufe vor dem Draw-Aufruf ist willkürlich. Die wichtigsten Unterschiede im Direct3D 10-API-Design sind wie folgt:
- Entfernen der festen Funktion
- Entfernen von CAPS-Bits: Der Basisfeaturesatz von Direct3D 10 ist garantiert
- Strengere Verwaltung von: Ressourcenzugriff, Gerätestatus, Shaderkonstanten, Shaderverknüpfung (Eingaben und Ausgaben zu Shadern) zwischen Phasen
- Änderungen des API-Einstiegspunktnamens spiegeln die Verwendung des virtuellen GPU-Arbeitsspeichers (Map() anstelle von Lock()) wider.
- Zum Erstellungszeitpunkt kann dem Gerät eine Debugebene hinzugefügt werden.
- Die primitive Topologie ist jetzt ein expliziter Zustand (getrennt vom Draw-Aufruf ).
- Explizite Shaderkonstanten werden jetzt in Konstantenpuffern gespeichert.
- Die Shadererstellung erfolgt vollständig in HLSL. Der HLSL-Compiler befindet sich jetzt in der primären Direct3D 10-DLL.
- Neue programmierbare Phase – der Geometrie-Shader
- Entfernen von BeginScene()/EndScene()
- Allgemeine 2D-, Fokus- und Adapterverwaltungsfunktionen, die in einer neuen Komponente implementiert sind: DXGI
Entfernen der festen Funktion
Es ist manchmal überraschend, dass selbst in einer Direct3D 9-Engine, die die programmierbare Pipeline vollständig ausnutzt, eine Reihe von Bereichen vorhanden ist, die von der FF-Pipeline (Fixed-Function) abhängen. Die häufigsten Bereiche beziehen sich in der Regel auf das bildschirmraumorientierte Rendering für die Benutzeroberfläche. Aus diesem Grund müssen Sie wahrscheinlich einen FF-Emulationshader oder eine Reihe von Shadern erstellen, die das erforderliche Ersatzverhalten bereitstellen.
Diese Dokumentation enthält ein Whitepaper mit Ersatz-Shaderquellen für die häufigsten FF-Verhaltensweisen (siehe Emu-Beispiel für Fixed Function). Einige Pixelverhalten mit festen Funktionen, einschließlich Alphatest, wurden in Shader verschoben.
Überprüfung der Geräteobjekterstellungszeit
Die Direct3D 10-Pipeline wurde von Grund auf neu in Hardware und Software überarbeitet, um den CPU-Overhead (zur Draw-Zeit) zu reduzieren. Um die Kosten zu senken, wurde allen Arten von Gerätedaten ein Objekt mit expliziten Erstellungsmethoden zugewiesen, die vom Gerät selbst bereitgestellt werden. Dies ermöglicht eine strikte Datenvalidierung während der Objekterstellungszeit anstatt während des Draw-Aufrufs, wie dies häufig bei Direct3D 9 der Fall ist.
Engineabstraktionen/Trennung
Anwendungen, einschließlich Games, die sowohl Direct3D 9 als auch Direct3D 10 unterstützen möchten, müssen die Renderingebenen von der restlichen Codebasis abstrahiert werden. Es gibt viele Möglichkeiten, dies zu erreichen, aber der Schlüssel zu allen ist der Entwurf der Abstraktionsebene für das Direct3D-Gerät auf niedrigerer Ebene. Alle Systeme sollten mit der Hardware über die gemeinsame Ebene kommunizieren, die für die Verwaltung von GPU-Ressourcen und low-Level-Typen konzipiert ist.
Direktes Entfernen von Direct3D 9-Abhängigkeiten
Beim Portieren großer, zuvor getesteter Codebasen ist es wichtig, die Menge an Codeänderungen zu minimieren, die unbedingt erforderlich sind, um zuvor getestete Verhaltensweisen im Code beizubehalten. Zu den bewährten Methoden gehört es, mithilfe von Kommentaren klar zu dokumentieren, wo Sich Elemente ändern. Für diese Arbeit ist es oft nützlich, einen Kommentarstandard zu haben, der eine schnelle Navigation durch die Codebasis ermöglicht.
Im Folgenden finden Sie eine Beispielliste von Standardkommentaren für einzelne Zeilen/Startblocks, die für diese Arbeit verwendet werden könnten.
Element | Beschreibung |
---|---|
Direct3D 10 ENTFERNT |
Verwenden Sie dies, wenn Zeilen/Codeblöcke entfernt werden. |
Direct3D 10 BENÖTIGT UPDATE |
Es hilft, dem NEED UPDATE-Kommentar zusätzliche Hinweise hinzuzufügen, die vorschlagen, welche Arbeits-/neue API für spätere Besuche des Codes für die Verhaltenskonvertierung verwendet werden soll. Starke Verwendung von assert(false) sollte auch verwendet werden, wenn \\ Direct3D 10 NEEDS UPDATE auftritt, um sicherzustellen, dass Sie nicht unwissentlich fehlerhaften Code ausführen. |
Direct3D 10 GEÄNDERT |
Bereiche, in denen größere Änderungen aufgetreten sind, sollten für die Zukunft beibehalten, aber auskommentiert werden. |
Direct3D 10 END |
Beenden des Codeblockqualifizierers |
Für mehrere Quellzeilen sollten Sie auch die Kommentare im C-Format /* */ verwenden, aber die relevanten Anfangs-/Endkommentare zu diesen Bereichen hinzufügen.
Tricks zum schnellen Beheben von Anwendungsbuildproblemen
Überschreiben von Direct3D 9-Typen
Es kann hilfreich sein, eine allgemeine Headerdatei mit Typdefinitionen/Außerkraftsetzungen für Direct3D 9-Basistypen einzufügen, die von den Direct3D 10-Headern nicht mehr unterstützt werden. Auf diese Weise können Sie die Menge der Änderungen am Code und an schnittstellen minimieren, bei denen eine direkte Zuordnung von einem Direct3D 9-Typ zum neu definierten Direct3D 10-Typ vorhanden ist. Dieser Ansatz ist auch nützlich, um Codeverhalten in einer Quelldatei zusammenzuhalten. In diesem Fall empfiehlt es sich, versionsneutrale /allgemein benannte Typen zu definieren, die allgemeine Konstrukte beschreiben, die zum Rendern verwendet werden, aber sowohl Direct3D 9- als auch Direct3D 10-APIs umfassen. Beispiel:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Weitere spezifische Direct3D 10-Beispiele hierfür sind:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Beheben von Linkproblemen
Es ist ratsam, Direct3D 10- und Windows Vista-Anwendungen mit der neuesten Version von Microsoft Visual Studio zu entwickeln. Es ist jedoch möglich, mit der früheren Version 2003 von Visual Studio eine Windows Vista-Anwendung zu erstellen, die von Direct3D 10 abhängt. Direct3D 10 ist eine Windows Vista-Plattformkomponente, die Abhängigkeiten (wie beim Server 2003 SP1 Platform SDK) für die folgende Lib aufweist: BufferOverflowU.lib wird benötigt, um probleme mit buffer_security Check Linker zu beheben.
Simulieren von Geräte-CAPs
Viele Anwendungen enthalten Codebereiche, die davon abhängen, dass CAPS-Daten des Geräts verfügbar sind. Umgehen Sie dies, indem Sie die Geräteenumeration überschreiben und die GERÄTE-CAPS auf sinnvolle Werte erzwingen. Planen Sie, Bereiche, in denen Abhängigkeiten von CAPS bestehen, später erneut zu besuchen, um die CAPS nach Möglichkeit vollständig zu entfernen.
Steuern der Direct3D 10-API
Dieser Abschnitt konzentriert sich auf die Verhaltensänderungen, die durch die Direct3D 10-API verursacht werden.
- Ressourcenerstellung
- Ansichten
- Statischer und dynamischer Ressourcenzugriff
- Direct3D 10-Effekte
- HLSL ohne Effekte
- Shaderkompilierung
- Erstellen von Shaderressourcen
- Schnittstelle zur Shaderreflektionsebene
- Layouts für Eingabeassesstruators – Vertex-Shader/Eingabestreamverknüpfung
- Auswirkungen der Entfernung von shader dead code
- Beispiel für eine Vertex-Shader-Eingabestruktur
- Erstellung des Zustandsobjekts
Ressourcenerstellung
Die Direct3D 10-API hat Ressourcen als generische Puffertypen entworfen, die gemäß der geplanten Verwendung über bestimmte Bindungsflags verfügen. Dieser Entwurfspunkt wurde ausgewählt, um den nahezu allgegenwärtigen Zugriff auf Ressourcen in der Pipeline für Szenarien wie das Rendern in einem Vertexpuffer zu ermöglichen und dann sofort die Ergebnisse zu zeichnen, ohne die CPU zu unterbrechen. Im folgenden Beispiel wird die Zuordnung von Vertexpuffern und Indexpuffern veranschaulicht, wobei Sie sehen können, dass sich die Ressourcenbeschreibung nur durch die GPU-Ressourcenbindungsflags unterscheidet.
Die Direct3D 10-API hat Texturhilfsmethoden zum expliziten Erstellen von Texturtypressourcen bereitgestellt, aber wie Sie sich vorstellen können, sind dies wirklich Hilfsfunktionen.
- CreateTexture2D()
- CreateTextureCube()
- CreateTexture3D()
Wenn Sie Direct3D 10 als Ziel verwenden, sollten Sie während der Ressourcenerstellungszeit wahrscheinlich mehr Elemente zuordnen, als Sie mit Direct3D 9 gewohnt sind. Dies wird am deutlichsten bei der Erstellung von Renderzielpuffern und Texturen, bei denen Sie auch eine Ansicht für den Zugriff auf den Puffer und das Festlegen der Ressource auf dem Gerät erstellen müssen.
Tutorial 1: Direct3D 10– Grundlagen
Hinweis
Direct3D 10 und höhere Versionen von Direct3D erweitern das DDS-Dateiformat, um neue DXGI-Formate, Texturarrays und Cubezuordnungsarrays zu unterstützen. Weitere Informationen zur DDS-Dateiformaterweiterung finden Sie im Programmierhandbuch für DDS.
Sichten
Eine Ansicht ist eine speziell typisierte Schnittstelle zu Daten, die in einem Pixelpuffer gespeichert sind. Einer Ressource können mehrere Ansichten gleichzeitig zugeordnet sein, und dieses Feature ist im Beispiel Rendern mit einem einzelnen Pass in Cubemap in diesem SDK hervorgehoben.
Seite "Programmiererhandbuch" zum Ressourcenzugriff
Statischer und dynamischer Ressourcenzugriff
Um eine optimale Leistung zu erzielen, sollten Anwendungen ihre Datennutzung in Bezug auf die statische und dynamische Natur der Daten partitionieren. Direct3D 10 wurde entwickelt, um diesen Ansatz zu nutzen, und daher wurden die Zugriffsregeln für Ressourcen gegenüber Direct3D 9 erheblich verschärft. Bei statischen Ressourcen sollten Sie die Ressource idealerweise während der Erstellungszeit mit ihren Daten auffüllen. Wenn Ihre Engine um den Entwurfspunkt Erstellen, Sperren, Ausfüllen, Entsperren von Direct3D 9 entworfen wurde, können Sie die Auffüllung von Create time mithilfe einer Stagingressource und der UpdateSubResource-Methode auf der Ressourcenschnittstelle zurückstellen.
Direct3D 10-Effekte
Die Verwendung des Direct3D 10 Effects-Systems liegt außerhalb des Rahmens dieses Artikels. Das System wurde geschrieben, um die Vorteile der Architektur, die Direct3D 10 bietet, in vollem Umfang zu nutzen. Weitere Informationen zur Verwendung finden Sie im Abschnitt Effekte (Direct3D 10).
HLSL ohne Effekte
Die Direct3D 10-Shaderpipeline kann ohne die Verwendung des Direct3D 10 Effects-Systems gesteuert werden. Beachten Sie, dass in diesem instance alle Konstantenpuffer, Shader, Sampler und Texturbindungen von der Anwendung selbst verwaltet werden müssen. Weitere Informationen finden Sie im Beispiellink und in den folgenden Abschnitten dieses Dokuments:
BEISPIEL FÜR HLSL ohne Effekte
Shaderkompilierung
Der Direct3D 10 HLSL-Compiler bietet Verbesserungen an der HLSL-Sprachdefinition und kann daher in zwei Modi arbeiten. Damit systeminterne Funktionen und Semantik im Direct3D 9-Stil vollständig unterstützt werden, sollte die Kompilierung mithilfe des COMPATIBILITY MODE-Flags aufgerufen werden, das pro Kompilierung angegeben werden kann.
Die spezifische HLSL-Sprachsemantik des Shadermodells 4.0 und die systeminternen Funktionen für Direct3D 10 finden Sie unter HLSL. Wichtige Änderungen in der Syntax von Direct3D 9 HLSL, die am meisten beachtet werden, liegen im Bereich des Texturzugriffs. Die neue Syntax ist die einzige Form, die vom Compiler außerhalb des Kompatibilitätsmodus unterstützt wird.
Hinweis
Die Direct3D 10-Compiler-APIs (D3D10CompileShader und D3D10CompileEffectFromMemory) werden von den Direct3D 10-, 10.1- und 11-Runtimes bereitgestellt, die in Windows Vista und höher ausgeführt werden. Die Direct3D 10-Compiler-APIs verfügen über die gleiche Funktionalität wie der HLSL-Compiler, der im DirectX SDK (Dezember 2006) enthalten ist. Dieser HLSL-Compiler unterstützt die Direct3D 10.1-Profile (vs_4_1, ps_4_1, gs_4_1, fx_4_1) nicht und es fehlen einige Optimierungen und Verbesserungen. Sie können einen HLSL-Compiler abrufen, der die Direct3D 10.1-Profile aus der neuesten Version des DirectX SDK unterstützt. Informationen zum Legacy-DirectX SDK finden Sie unter Wo befindet sich das DirectX SDK?. Sie können die neuesten HLSL-Fxc.exe Befehlszeilencompiler und D3DCompiler-APIs aus dem Windows SDK abrufen.
Erstellen von Shaderressourcen
Die Erstellung kompilierter Shaderinstanzen außerhalb des Direct3D 10 Effects-Systems erfolgt auf sehr ähnliche Weise wie Direct3D 9, aber in Direct3D 10 ist es wichtig, die Shadereingabesignatur zur späteren Verwendung beizubehalten. Die Signatur wird standardmäßig als Teil des Shaderblobs zurückgegeben, kann jedoch extrahiert werden, um die Arbeitsspeicheranforderungen bei Bedarf zu reduzieren. Weitere Informationen finden Sie unter Verwenden von Shadern in Direct3D 10.
Schnittstelle zur Shaderreflektionsebene
Die Shaderreflektionsebene ist die Schnittstelle, über die Informationen zu den Shaderanforderungen abgerufen werden können. Dies ist besonders nützlich, wenn Sie Eingabeassemblyverknüpfungen erstellen (siehe unten), bei denen Sie möglicherweise die Shadereingabeanforderungen durchlaufen müssen, um sicherzustellen, dass Sie die richtige Eingabestruktur für den Shader bereitstellen. Sie können eine instance der Reflektionsebenenschnittstelle gleichzeitig mit dem Erstellen einer instance eines kompilierten Shaders erstellen.
Die Shaderreflektionsebene ersetzt D3DX9-Methoden, die ähnliche Funktionen bereitstellen. Beispielsweise wird IsParameterUsed durch die GetDesc-Methode ersetzt.
Layouts für Eingabeassesstruators – Vertex-Shader/Eingabestreamverknüpfung
Der Input Assembler (IA) ersetzt die Vertex Stream-Deklaration im Direct3D 9-Format, und die Beschreibungsstruktur ist in ihrer Form sehr ähnlich. Der Standard Unterschied, den die IA mit sich bringt, besteht darin, dass das erstellte IA-Layoutobjekt direkt einem bestimmten Format der Shadereingabesignatur zugeordnet werden muss. Das Zum Verknüpfen des Eingabedatenstroms mit dem Shader erstellte Zuordnungsobjekt kann für eine beliebige Anzahl von Shadern verwendet werden, bei denen die Shadereingabesignatur mit der des Shaders übereinstimmt, der zum Erstellen des Eingabelayouts verwendet wurde.
Um die Pipeline am besten mit statischen Daten zu steuern, sollten Sie die Permutationen des Eingabedatenstromformats zu möglichen Shadereingabesignaturen berücksichtigen und die IA-Layoutobjektinstanzen so früh wie möglich erstellen und nach Möglichkeit wiederverwenden.
Auswirkungen der Entfernung von shader dead code
Im folgenden Abschnitt wird ein erheblicher Unterschied zwischen Direct3D 9 und Direct3D 10 beschrieben, der wahrscheinlich eine sorgfältige Behandlung in Ihrem Engine-Code erfordert. Bei Shadern, die bedingte Ausdrücke enthalten, werden häufig bestimmte Codepfade im Rahmen des Kompilierungsprozesses entfernt. In Direct3D 9 können zwei Arten von Eingaben entfernt (zum Entfernen markiert) werden, wenn sie nicht verwendet werden: Signatureingaben (wie das folgende Beispiel) und Konstanteneingaben. Wenn das Ende des Konstantenpuffers nicht verwendete Einträge enthält, spiegelt die Größendeklaration im Shader die Größe des Konstantenpuffers ohne die nicht verwendeten Einträge am Ende wider. Beide Arten von Eingaben verbleiben in Signaturen oder Konstantenpuffern Direct3D 10 mit einer besonderen Ausnahme bei nicht verwendeten Konstanteneingaben am Ende eines Konstantenpuffers. Dies kann Auswirkungen auf die Engine haben, wenn große Shader verarbeitet und Eingabelayouts erstellt werden. Elemente, die durch optimierungen des nicht beendeten Codes im Compiler entfernt werden, müssen weiterhin in der Eingabestruktur deklariert werden. Dies wird im folgenden Beispiel veranschaulicht:
Beispiel für die Vertex-Shader-Eingabestruktur
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* Das Entfernen von direct3D 9 toter Code würde die Deklaration im Shader aufgrund der Entfernung von bedingtem toten Code entfernen.
float4x4 g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant
VS_INPUT main(VS_INPUT i)
{
VS_INPUT o;
o.pos = mul( i.pos, g_WorldViewProjMtx);
o.uv1 = i.uv1;
if ( g_bLightMapped )
{
o.uv2 = i.uv2;
}
return o;
}
Oder Sie können es mit der folgenden Deklaration noch deutlicher machen, dass es sich bei der Konstante um eine Kompilierzeitkonstante handelt:
#define LIGHT_MAPPED false
Im obigen Beispiel würde unter Direct3D 9 das uv2-Element aufgrund von optimierungen des nicht beendeten Codes im Compiler entfernt. Unter Direct3D 10 wird der tote Code weiterhin entfernt, aber das Layout des Shadereingabeassens erfordert, dass die Definition der Eingabedaten vorhanden ist. Die Shaderreflektionsebene bietet die Möglichkeit, diese Situation auf generische Weise zu behandeln, wobei Sie die Anforderungen an die Shadereingabe durchlaufen und sicherstellen können, dass Sie eine vollständige Beschreibung der Zuordnung von Eingabedatenstrom zur Shadersignatur bereitstellen.
Hier sehen Sie eine Beispielfunktion, um das Vorhandensein eines semantischen Namens/Index in einer Funktionssignatur zu erkennen:
// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
D3D10_SHADER_DESC shaderDesc;
D3D10_SIGNATURE_PARAMETER_DESC paramDesc;
Assert(pReflector);
Assert(SemanticName);
pReflector->GetDesc(&shaderDesc);
for (UINT k=0; k<shaderDesc.InputParameters; k++)
{
pReflector->GetInputParameterDesc( k, ¶mDesc);
if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex)
return true;
}
return false;
}
Zustandsobjekterstellung
Beim Portieren von Enginecode kann es hilfreich sein, zunächst einen Standardsatz von Zustandsobjekten zu verwenden und alle Direct3D 9-Geräterenderungsstatus-/Texturzustandseinstellungen zu deaktivieren. Dies führt zu Renderingartefakten, ist aber die schnellste Möglichkeit, die Dinge in Betrieb zu bringen. Sie können später ein Zustandsobjektverwaltungssystem erstellen, das einen zusammengesetzten Schlüssel verwenden kann, um eine maximale Wiederverwendung der Anzahl der verwendeten Zustandsobjekte zu ermöglichen.
Portieren von Texturen
Unterstützte Dateiformate
Die Funktionen D3DXxxCreateXXX und D3DXxxSaveXXX, die eine Textur aus oder in einer Grafikdatei erstellen oder in einer Grafikdatei speichern (z. B. D3DX10CreateTextureFromFile), unterstützen einen anderen Satz von Dateiformaten in Direct3D 10 als in Direct3D 9:
Dateiformat | Direct3D 9 | Direct3D 10 |
---|---|---|
BMP | x | x |
.jpg | x | x |
.tga | x | |
.png | x | x |
.dds | x | x |
.Ppm | x | |
DIB | x | |
.Hdr | x | |
.Pfm | x | |
TIFF | x | |
.gif | x | |
.tif | x |
Weitere Informationen finden Sie unter Vergleichen der Direct3D 9-D3DXIMAGE_FILEFORMAT-Enumerationen mit den D3DX10_IMAGE_FILE_FORMAT-Enumerationen für Direct3D 10.
Hinweis
Die Hilfsprogrammbibliothek D3DX (D3DX 9, D3DX 10 und D3DX 11) ist für Windows 8 veraltet. Für die Verarbeitung von Texturdateien wird empfohlen, DirectXTex zu verwenden.
Zuordnungstexturformate
Die folgende Tabelle zeigt die Zuordnung der Texturformate von Direct3D 9 zu Direct3D 10. Alle Inhalte in Formaten, die in DXGI nicht verfügbar sind, müssen von Hilfsprogrammroutinen konvertiert werden.
Direct3D 9-Format | Direct3D 10-Format |
---|---|
D3DFMT_UNKNOWN | DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 | Nicht verfügbar |
D3DFMT_A8R8G8B8 | DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB¹ |
D3DFMT_X8R8G8B8 | DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB¹ |
D3DFMT_R5G6B5 | DXGI_FORMAT_B5G6R5_UNORM² |
D3DFMT_X1R5G5B5 | Nicht verfügbar |
D3DFMT_A1R5G5B5 | DXGI_FORMAT_B5G5R5A1_UNORM² |
D3DFMT_A4R4G4B4 | DXGI_FORMAT_B4G4R4A4_UNORM³ |
D3DFMT_R3G3B2 | Nicht verfügbar |
D3DFMT_A8 | DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 | Nicht verfügbar |
D3DFMT_X4R4G4B4 | Nicht verfügbar |
D3DFMT_A2B10G10R10 | DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 | DXGI_FORMAT_R8G8B8A8_UNORM & DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 | Nicht verfügbar |
D3DFMT_G16R16 | DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 | Nicht verfügbar |
D3DFMT_A16B16G16R16 | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 | Nicht verfügbar |
D3DFMT_P8 | Nicht verfügbar |
D3DFMT_L8 | DXGI_FORMAT_R8_UNORM Hinweis: Verwenden Sie .r swizzle im Shader, um Rot auf andere Komponenten zu duplizieren, um das D3D9-Verhalten zu erhalten. |
D3DFMT_A8L8 | DXGI_FORMAT_R8G8_UNORM Hinweis: Verwenden Sie swizzle .rrrg im Shader, um Rot zu duplizieren und grün in die Alphakomponenten zu verschieben, um das D3D9-Verhalten zu erhalten. |
D3DFMT_A4L4 | Nicht verfügbar |
D3DFMT_V8U8 | DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 | Nicht verfügbar |
D3DFMT_X8L8V8U8 | Nicht verfügbar |
D3DFMT_Q8W8V8U8 | DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 | DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 | Nicht verfügbar |
D3DFMT_A2W10V10U10 | Nicht verfügbar |
D3DFMT_UYVY | Nicht verfügbar |
D3DFMT_R8G8_B8G8 | DXGI_FORMAT_G8R8_G8B8_UNORM (in DX9 wurden die Daten um 255,0f hochskaliert, aber dies kann im Shadercode behandelt werden). |
D3DFMT_YUY2 | Nicht verfügbar |
D3DFMT_G8R8_G8B8 | DXGI_FORMAT_R8G8_B8G8_UNORM (in DX9 wurden die Daten um 255,0f hochskaliert, aber dies kann im Shadercode behandelt werden). |
D3DFMT_DXT1 | DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 | & DXGI_FORMAT_BC1_UNORM DXGI_FORMAT_BC1_UNORM_SRGB Hinweis: DXT1 und DXT2 sind aus API-/Hardwaresicht identisch... der einzige Unterschied war "prämultipliziertes Alpha", das von einer Anwendung nachverfolgt werden kann und kein separates Format benötigt. |
D3DFMT_DXT3 | DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 | & DXGI_FORMAT_BC2_UNORM DXGI_FORMAT_BC2_UNORM_SRGB Hinweis: DXT3 und DXT4 sind aus API-/Hardwaresicht identisch... der einzige Unterschied war "prämultipliziertes Alpha", das von einer Anwendung nachverfolgt werden kann und kein separates Format benötigt. |
D3DFMT_DXT5 | DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 & D3DFMT_D16_LOCKABLE | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 | Nicht verfügbar |
D3DFMT_D15S1 | Nicht verfügbar |
D3DFMT_D24S8 | Nicht verfügbar |
D3DFMT_D24X8 | Nicht verfügbar |
D3DFMT_D24X4S4 | Nicht verfügbar |
D3DFMT_D16 | DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE | DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 | Nicht verfügbar |
D3DFMT_S1D15 | Nicht verfügbar |
D3DFMT_S8D24 | DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 | Nicht verfügbar |
D3DFMT_X4S4D24 | Nicht verfügbar |
D3DFMT_L16 | DXGI_FORMAT_R16_UNORM Hinweis: Verwenden Sie .r swizzle im Shader, um Rot in andere Komponenten zu duplizieren, um das D3D9-Verhalten zu erhalten. |
D3DFMT_INDEX16 | DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 | DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 | Nicht verfügbar |
D3DFMT_R16F | DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F | DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F | DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F | DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F | DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 | Nicht verfügbar |
D3DDECLTYPE_FLOAT1 | DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 | DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 | DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 | DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR | Nicht verfügbar |
D3DDECLTYPE_UBYTE4 | DXGI_FORMAT_R8G8B8A8_UINT Hinweis: Shader ruft UINT-Werte ab, aber wenn Direct3D 9-Stil-Floats benötigt werden (0,0f, 1,0f... 255.f), kann UINT einfach in float32 im Shader konvertiert werden. |
D3DDECLTYPE_SHORT2 | DXGI_FORMAT_R16G16_SINT Hinweis: Shader ruft SINT-Werte ab, aber wenn integrale Floats im Direct3D 9-Stil erforderlich sind, kann SINT einfach in float32 im Shader konvertiert werden. |
D3DDECLTYPE_SHORT4 | DXGI_FORMAT_R16G16B16A16_SINT Hinweis: Shader ruft SINT-Werte ab, aber wenn integrale Floats im Direct3D 9-Stil erforderlich sind, kann SINT einfach in float32 im Shader konvertiert werden. |
D3DDECLTYPE_UBYTE4N | DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N | DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N | DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N | DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N | DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 | Nicht verfügbar |
D3DDECLTYPE_DEC3N | Nicht verfügbar |
D3DDECLTYPE_FLOAT16_2 | DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 | DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' | DXGI_FORMAT_BC4_UNORM |
FourCC 'ATI2' | DXGI_FORMAT_BC5_UNORM |
¹DXGI 1.1, das in der Direct3D 11-Runtime enthalten ist, enthält BGRA-Formate. Die Unterstützung für diese Formate ist jedoch optional für Direct3D 10- und 10.1-Geräte mit Treibern, die im Windows Display Driver Model (WDDM) für Windows Vista (WDDM 1.0) implementiert sind. Erwägen Sie stattdessen die Verwendung DXGI_FORMAT_R8G8B8A8_UNORM. Alternativ können Sie Ihr Gerät mit D3D10_CREATE_DEVICE_BGRA_SUPPORT erstellen, um sicherzustellen, dass Sie nur Computer unterstützen, auf denen die Direct3D 11.0-Runtime und ein WDDM 1.1-Treiber oder höher installiert sind.
²DXGI 1.0 definierte die Formate 5:6:5 und 5:5:5:1, wurden jedoch von der Direct3D 10.x- oder Direct3D 11.0-Runtime nicht unterstützt. Diese Formate werden optional mit DXGI 1.2 in der DirectX 11.1-Runtime unterstützt, die für Treiber auf Featureebene 11.1 und WDDM 1.2 (Anzeigetreibermodell ab Windows 8) erforderlich ist und bereits auf Featureebenen mit 10level9 unterstützt wird.
³DXGI 1.2 hat das Format 4:4:4:4:4 eingeführt. Dieses Format wird optional in der DirectX 11.1-Runtime unterstützt, die für Featureebene 11.1-Grafikkarten und WDDM 1.2-Treiber erforderlich ist und bereits auf 10Level9-Featureebenen unterstützt wird.
Für nicht komprimierte Formate hat DXGI die Unterstützung für beliebige Pixelformatmuster eingeschränkt. Alle nicht komprimierten Formate müssen vom Typ RGBA sein. Dies erfordert möglicherweise das Verschieben vorhandener Ressourcenpixelformate. Es wird empfohlen, nach Möglichkeit als Offline-Vorprozessdurchlauf zu berechnen.
Portieren von Shadern
Direct3D 10-Shader werden in HLSL erstellt
Direct3D 10 schränkt die Verwendung der Assemblysprache nur auf debugzwecke ein, daher müssen alle in Direct3D 9 verwendeten handgeschriebenen Assemblyshader in HLSL konvertiert werden.
Shadersignaturen und Verknüpfung
Wir haben die Anforderungen für die Verknüpfung der Eingabeassembly mit Vertex-Shadereingabesignaturen weiter oben in diesem Dokument erläutert (siehe oben). Beachten Sie, dass die Direct3D 10-Runtime auch die Anforderungen für die Verknüpfung von Phase zu Phase zwischen Shadern verschärft hat. Diese Änderung wirkt sich auf Shaderquellen aus, bei denen die Bindung zwischen Phasen unter Direct3D 9 möglicherweise nicht vollständig beschrieben wurde. Beispiel:
VS_OUTPUT PS_INPUT
float4 pos : SV_POSITION; float4 pos : SV_POSITION;
float4 uv1 : TEXCOORD1; float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4 Color : TEXCOORD6; float4 color : TEXCOORD6;
* Broken VS - PS Linkage: Auch wenn der Pixel-Shader möglicherweise nicht an der vollständigen Matrix interessiert ist, muss die Verknüpfung den vollständigen float4x3 angeben.
Beachten Sie, dass die Verknüpfungssemantik zwischen Phasen genau übereinstimmen muss, aber die Eingaben der Zielstufen können ein Präfix der ausgegebenen Werte sein. Im obigen Beispiel könnte der Pixel-Shader position und texcoord1 als einzige Eingaben haben, aber aufgrund der Bestelleinschränkungen nicht die Position und texcoord2 als einzige Eingaben haben.
HLSL Shader Stage-Verknüpfungen
Die Verknüpfung zwischen Shadern kann an einem der folgenden Punkte in der Pipeline auftreten:
- Input Assembler to Vertex Shader
- Vertex-Shader zu Pixel-Shader
- Vertex-Shader zu Geometry-Shader
- Vertex-Shader zum Streamen der Ausgabe
- Geometrie-Shader zu Pixel-Shader
- Geometrie-Shader zum Streamen
Konstantenpuffer
Zur Vereinfachung der Portierung von Inhalten aus Direct3D 9 kann ein anfänglicher Ansatz zur konstanten Verwaltung außerhalb des Effects-Systems die Erstellung eines einzelnen Konstantenpuffers mit allen erforderlichen Konstanten umfassen. Für die Leistung ist es wichtig, Konstanten nach der erwarteten Aktualisierungshäufigkeit in Puffern anordnen. Durch diese organization wird die Anzahl redundanter Konstantensätze auf ein Minimum reduziert.
Benutzerclipebenen in HLSL auf Featureebene 9 und höher
Ab Windows 8 können Sie das Funktionsattribut clipplanes in einer HLSL-Funktionsdeklaration anstelle von SV_ClipDistance verwenden, damit Ihr Shader auf Featureebene 9_x sowie auf Featureebene 10 und höher funktioniert. Weitere Informationen finden Sie unter Benutzerclipebenen auf Hardware der Featureebene 9.
Zusätzliche Direct3D 10-Unterschiede zur Überwachung
Ganze Zahlen als Eingabe
In Direct3D 9 gab es keine echte Hardwareunterstützung für ganzzahlige Datentypen. Direct3D 10-Hardware unterstützt jedoch explizite ganzzahlige Typen. Wenn Sie Gleitkommadaten in Ihrem Vertexpuffer haben, müssen Sie über eine Floateingabe verfügen. Andernfalls ist ein ganzzahliger Typ die Bitmusterdarstellung des Gleitkommawerts. Ein ganzzahliger Typ ist für eine Pixel-Shadereingabe nicht zulässig, es sei denn, der Wert ist für keine Interpolation markiert (siehe Interpolationsmodifizierer).
Mauscursor
In früheren Versionen von Windows funktionierten die standardmäßigen GDI-Mauscursorroutinen nicht ordnungsgemäß auf allen exklusiven Vollbildgeräten. Die APIs SetCursorProperties, ShowCursor und SetCursorPosition wurden hinzugefügt, um diese Fälle zu behandeln. Da die Windows Vista-Version von GDI DXGI-Oberflächen vollständig versteht, ist diese spezielle Mauscursor-API nicht erforderlich, sodass es kein Direct3D 10-Äquivalent gibt. Direct3D 10-Anwendungen sollten stattdessen die Standard-GDI-Mauscursorroutinen für Mauscursor verwenden.
Zuordnen von Texels zu Pixeln in Direct3D 10
In Direct3D 9 waren texel-Center und Pixelzentren eine halbe Einheit voneinander entfernt (siehe Direkte Zuordnung von Texels zu Pixeln (Direct3D 9)). In Direct3D 10 befinden sich texel-Zentren bereits bei halber Einheit, sodass vertexkoordinaten überhaupt nicht verschoben werden müssen.
Das Rendern von Vollbild-Quads ist mit Direct3D 10 geradliniger. Vollbild-Quads sollten im Clipspace (-1,1) definiert werden und einfach ohne Änderungen den Vertex-Shader durchlaufen. Auf diese Weise ist es nicht erforderlich, den Vertexpuffer jedes Mal neu zu laden, wenn sich die Bildschirmauflösung ändert, und es gibt keine zusätzliche Arbeit im Pixel-Shader, um die Texturkoordinaten zu bearbeiten.
Änderungen des Referenzzählungsverhaltens
Im Gegensatz zu früheren Direct3D-Versionen enthalten die verschiedenen Set-Funktionen keinen Verweis auf die Geräteobjekte. Dies bedeutet, dass die Anwendung sicherstellen muss, dass sie einen Verweis auf das Objekt enthält, solange das Objekt an die Pipeline gebunden werden soll. Wenn die Ref-Anzahl des Objekts auf 0 sinkt, wird das Objekt von der Pipeline getrennt, während es zerstört wird. Diese Art des Verweishaltes wird auch als Schwachverweisspeicherung bezeichnet, daher enthält jede Bindungsposition im Device-Objekt einen schwachen Verweis auf die Schnittstelle/das Objekt. Sofern nicht explizit anders angegeben, sollte dieses Verhalten für alle Set-Methoden angenommen werden. Wenn die Zerstörung eines Objekts dazu führt, dass ein Bindungspunkt auf NULL festgelegt wird, gibt die Debugebene eine Warnung aus. Beachten Sie, dass Aufrufe von Get-Methoden des Geräts wie OMGetRenderTargets die Verweisanzahl der zurückgegebenen Objekte erhöhen.
Kooperative Ebene testen
Die Funktionalität der Direct3D 9-API TestCooperativeLevel entspricht dem Festlegen der DXGI_PRESENT_TEST beim Aufrufen von Present.
StretchRect
Eine Funktion ähnlich der Direct3D 9 IDirect3DDevice9::StretchRect-Methode ist in Direct3D 10 und 10.1 nicht verfügbar. Um Ressourcenoberflächen zu kopieren, verwenden Sie ID3D10Device::CopySubresourceRegion. Rendern Sie für Größenänderungen mithilfe der Texturfilterung in eine Textur. Verwenden Sie ZUM Konvertieren von MSAA-Oberflächen in Nicht-MSAA-Oberflächen ID3D10Device::ResolveSubresource.
Zusätzliche Direct3D 10.1-Unterschiede
Windows Vista mit Service Pack 1 (SP1) enthielt ein kleineres Update auf Direct3D 10 und Direct3D 10.1, das die folgenden zusätzlichen Hardwarefeatures verfügbar gemacht hat:
- MSAA-Shader pro Beispiel
- MSAA-Tiefenlesevorgang
- Unabhängige Mischmodi pro Renderziel
- Cubezuordnungsarrays
- Rendern in blockkomprimierte (BC)-Formate
Das Direct3D 10.1-Update hat Unterstützung für die folgenden neuen Schnittstellen hinzugefügt, die von vorhandenen Schnittstellen abgeleitet werden:
Das Direct3D 10.1-Update enthielt auch die folgenden zusätzlichen Strukturen:
Die Direct3D 10.1-API enthält ein neues Konzept mit dem Namen Featureebene. Dieses Konzept bedeutet, dass Sie die Direct3D 10.1-API verwenden können, um Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) oder Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1) Hardware zu steuern. Da die Direct3D 10.1-API von den Direct3D 10-Schnittstellen abgeleitet ist, können Anwendungen ein Direct3D 10.1-Gerät erstellen und es dann als Direct3D 10.0-Gerät verwenden, außer wenn neue 10.1-spezifische Features erforderlich sind (vorausgesetzt, dass die D3D10_FEATURE_LEVEL_10_1 Featureebene vorhanden ist und diese Features unterstützt).
Hinweis
Direct3D 10.1-Geräte können die vorhandenen 10.0 HLSL-Shaderprofile (vs_4_0, ps_4_0, gs_4_0) und die neuen 10.1-Profile (vs_4_1, ps_4_1, gs_4_1) mit zusätzlichen HLSL-Anweisungen und -Funktionen verwenden.
Windows 7 enthielt ein kleineres Update für die Direct3D 10.1-API, die in der Direct3D 11-Runtime enthalten ist. Dieses Update fügt Unterstützung für die folgenden Featureebenen hinzu:
Windows 7 hat auch Unterstützung für Direct3D 10.1 für Windows Advanced Rasterization Platform (WARP) hinzugefügt. Sie können einen WARP-Treiber mithilfe von D3D10_DRIVER_TYPE_WARP angeben.
Weitere Informationen zu Direct3D 10.1 finden Sie unter Direct3D 10.1 Features und D3D10_FEATURE_LEVEL1 Enumeration.
Zugehörige Themen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für