Überlegungen zu Direct3D 9 zu Direct3D 10 (Direct3D 10)
Die folgende Seite enthält eine grundlegende Übersicht der wichtigsten Unterschiede zwischen Direct3D 9 und Direct3D 10. Die nachstehende Gliederung enthält einige Einblicke, die Entwicklern mit Direct3D 9-Erfahrungen bei der Erkundung und Beziehung zu Direct3D 10 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 zum Migrieren von Direct3D 9 zu Direct3D 11. Informationen zum Wechsel von Direct3D 10 zu Direct3D 11 finden Sie unter Migrieren zu Direct3D 11.
- Übersicht über die wichtigsten Strukturänderungen in Direct3D 10
- Motorabstraktionen /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
- Shader Reflection Layer Interface
- Layouts des Eingabeassemblers – Vertex-Shader /Eingabedatenstromverknüpfung
- Auswirkungen der Deaktivierung von Shader-Code
- Beispiel für eine Vertex-Shader-Eingabestruktur
- Erstellung des State-Objekts
- Portieren von Texturen
- Portieren von Shadern
- Zusätzliche Direct3D 10-Unterschiede zur Überwachung
- Zusätzliche Direct3D 10.1-Unterschiede
- Verwandte Themen
Übersicht über die wichtigsten Strukturänderungen in Direct3D 10
Das Rendern mithilfe des Direct3D 10-Geräts ist strukturell mit Direct3D 9 vergleichbar.
- Festlegen einer Vertexdatenstromquelle
- Festlegen des Eingabelayouts in Direct3D 10 (Festlegen der Vertexdatenstromdeklaration in Direct3D 9)
- Deklarieren der primitiven Topologie
- Festlegen von Texturen
- Festlegen von Statusobjekten
- Festlegen von Shadern
- Draw
Der Draw-Aufruf verknüpft die Vorgänge miteinander. Die Reihenfolge der Aufrufe vor dem Draw-Aufruf ist beliebig. Die wichtigsten Unterschiede im Direct3D 10-API-Design sind wie folgt:
- Entfernen einer 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 für Shader) zwischen Phasen
- Änderungen des API-Einstiegspunkts spiegeln die Verwendung des virtuellen GPU-Speichers (Map() anstelle von Lock()) wider.
- Zur Erstellungszeit 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 Stufe – der Geometrie-Shader
- Entfernen von BeginScene()/EndScene()
- Allgemeine 2D-, Fokus- und Adapterverwaltungsfunktionen, die in einer neuen Komponente implementiert werden: DXGI
Entfernen einer festen Funktion
Es ist manchmal überraschend, dass selbst in einem Direct3D 9-Modul, das die programmierbare Pipeline vollständig ausnutzt, eine Reihe von Bereichen bestehen, die von der Pipeline mit fester Funktion (FF) abhängen. Die am häufigsten verwendeten Bereiche beziehen sich in der Regel auf das ausgerichtete Rendern des Bildschirmbereichs für die Benutzeroberfläche. Aus diesem Grund müssen Sie wahrscheinlich einen FF-Emulations-Shader oder einen Satz von Shadern erstellen, die das erforderliche Ersatzverhalten bereitstellen.
Diese Dokumentation enthält ein Whitepaper mit Ersatz-Shaderquellen für die am häufigsten verwendeten FF-Verhaltensweisen (siehe Beispiel für fixed Function EMU). Einige Pixelverhalten mit fester Funktion, einschließlich Alphatest, wurden in Shader verschoben.
Überprüfung der Erstellungszeit des Geräteobjekts
Die Direct3D 10-Pipeline wurde von Grund auf in Hardware und Software neu gestaltet und beabsichtigt, den CPU-Overhead (bei Draw time) zu reduzieren. Um die Kosten zu reduzieren, wurden allen Gerätedatentypen ein Objekt mit expliziten Erstellungsmethoden zugewiesen, die vom Gerät selbst bereitgestellt werden. Dies ermöglicht eine strenge Datenüberprüfung zur Objekterstellungszeit anstelle des Draw-Aufrufs, wie es bei Direct3D 9 häufig der Fall ist.
Motorabstraktionen /Trennung
Anwendungen, einschließlich Games, die Sowohl Direct3D 9 als auch Direct3D 10 unterstützen möchten, müssen die Renderingebenen aus der restlichen Codebasis abstrahiert haben. Es gibt viele Möglichkeiten, dies zu erreichen, aber der Schlüssel zu allen ist das Design der Abstraktionsebene für das Direct3D-Gerät auf niedrigerer Ebene. Alle Systeme sollten über die gemeinsame Ebene mit der Hardware kommunizieren, die für die Bereitstellung von GPU-Ressourcen und die Verwaltung von Typen auf niedriger Ebene konzipiert ist.
Direkte Entfernung von Direct3D 9-Abhängigkeiten
Beim Portieren großer, zuvor getesteter Codebasen ist es wichtig, die Menge der Codeänderungen zu minimieren, die unbedingt erforderlich sind, um zuvor getestete Verhaltensweisen im Code beizubehalten. Bewährte Methoden umfassen eine klare Dokumentation, bei der Elemente mithilfe von Kommentaren geändert werden. Es ist häufig hilfreich, einen Kommentarstandard für diese Arbeit zu verwenden, der die schnelle Navigation über die Codebasis ermöglicht.
Im Folgenden finden Sie eine Beispielliste der standardmäßigen Einzelzeilen-/Startblockkommentare, die für diese Arbeit verwendet werden können.
Artikel | Beschreibung |
---|---|
Direct3D 10 ENTFERNT |
Verwenden Sie diese Option, in der Zeilen/Codeblöcke entfernt werden. |
DIRECT3D 10 ERFORDERT UPDATE |
Es hilft, dem NEED UPDATE-Kommentar zusätzliche Hinweise hinzuzufügen, die vorschlagen, welche Arbeit/neue API für spätere Besuche im Code für die Verhaltenskonvertierung verwendet werden soll. Die 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 wichtige Änderungen vorgenommen wurden, sollten für zukünftige Referenz beibehalten, aber auskommentiert werden |
Direct3D 10 ENDE |
Endcodeblockqualifizierer |
Für mehrere Quellenzeilen sollten Sie auch die C-Formatvorlage /* */ Kommentare 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 Kopfzeilendatei 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 Anzahl der Änderungen im Code und den Schnittstellen minimieren, bei denen eine direkte Zuordnung von einem Direct3D 9-Typ zum neu definierten Direct3D 10-Typ vorhanden ist. Dieser Ansatz ist auch hilfreich, 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. Zum Beispiel:
#if defined(D3D9)
typedef IDirect3DIndexBuffer9 IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9 IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer IDirect3DIndexBuffer;
typedef ID3D10Buffer IDirect3DVertexBuffer
#endif
Weitere Direct3D 10-spezifische Beispiele hierfür sind:
typedef ID3D10TextureCube IDirect3DCubeTexture;
typedef ID3D10Texture3D IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT D3DVIEWPORT;
typedef ID3D10VertexShader IDirect3DVertexShader;
typedef ID3D10PixelShader IDirect3DPixelShader;
Beheben von Verknüpfungsproblemen
Es ist ratsam, Direct3D 10- und Windows Vista-Anwendungen mit der neuesten Version von Microsoft Visual Studio zu entwickeln. Es ist jedoch möglich, eine Windows Vista-Anwendung zu erstellen, die von Direct3D 10 mit der früheren Version von Visual Studio abhängt. Direct3D 10 ist eine Windows Vista-Plattformkomponente, die Abhängigkeiten (wie mit dem Server 2003 SP1-Plattform-SDK) in der folgenden Lib aufweist: BufferOverflowU.lib ist erforderlich, um probleme mit buffer_security Überprüfen von Linkerproblemen zu lösen.
Simulieren von Geräte-CAPs
Viele Anwendungen enthalten Codebereiche, die von verfügbaren CAPS-Gerätedaten abhängen. Umgehen Sie dies, indem Sie die Geräteenumeration außer Kraft setzen und Geräte CAPS zu sinnvollen Werten erzwingen. Planen Sie, Gebiete, in denen es Abhängigkeiten von CAPS gibt, später erneut zu besuchen, um 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
- Shader Reflection Layer Interface
- Layouts des Eingabeassemblers – Vertex-Shader /Eingabedatenstromverknüpfung
- Auswirkungen der Deaktivierung von Shader-Code
- Beispiel für eine Vertex-Shader-Eingabestruktur
- Erstellung des State-Objekts
Ressourcenerstellung
Die Direct3D 10-API hat Ressourcen als generische Puffertypen entwickelt, die bestimmte Bindungskennzeichnungen gemäß der geplanten Verwendung aufweisen. 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 erleichtern und dann sofort die Ergebnisse zu zeichnen, ohne die CPU zu unterbrechen. Im folgenden Beispiel wird die Zuordnung von Vertexpuffern und Indexpuffern veranschaulicht, in denen Sie sehen können, dass sich die Ressourcenbeschreibung nur von den 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()
Bei der Zielbestimmung von Direct3D 10 möchten Sie wahrscheinlich mehr Elemente während der Ressourcenerstellung zuordnen, als Sie mit Direct3D 9 verwendet werden. Dies wird am deutlichsten mit der Erstellung von Renderzielpuffern und Texturen, in denen Sie auch eine Ansicht für den Zugriff auf den Puffer erstellen und die Ressource auf dem Gerät festlegen müssen.
Lernprogramm 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.
Ansichten
Eine Ansicht ist eine speziell typierte Schnittstelle zu Daten, die in einem Pixelpuffer gespeichert sind. Eine Ressource kann mehrere Ansichten gleichzeitig zugeordnet haben, und dieses Feature wird im Beispiel "Single Pass Render to Cubemap" in diesem SDK hervorgehoben.
Programmierhandbuch-Seite im Ressourcenzugriff
Statischer und dynamischer Ressourcenzugriff
Um eine optimale Leistung zu erzielen, sollten Anwendungen ihre Datennutzung in Bezug auf die statische und dynamische Art 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 Ihr Modul um den Entwurfspunkt "Create", "Lock", "Fill", "Unlock" von Direct3D 9 entworfen wurde, können Sie die Population von "Zeit erstellen" zurückstellen, indem Sie eine Stagingressource-Ressource und die UpdateSubResource-Methode auf der Ressourcenschnittstelle verwenden.
Direct3D 10-Effekte
Die Verwendung des Direct3D 10 Effects-Systems liegt außerhalb des Umfangs dieses Artikels. Das System wurde geschrieben, um die architekturlichen Vorteile, die Direct3D 10 bietet, vollständig 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 dieser Instanz alle Konstantenpuffer, Shader, Sampler und Texturbindungen von der Anwendung selbst verwaltet werden müssen. Weitere Details finden Sie unter dem Beispiellink und den folgenden Abschnitten dieses Dokuments:
Shaderkompilierung
Der Direct3D 10 HLSL-Compiler bietet Verbesserungen an der HLSL-Sprachdefinition und bietet daher die Möglichkeit, in zwei Modi zu arbeiten. Zur vollständigen Unterstützung systeminterner Direct3D 9-Stilfunktionen und -semantik sollte die Kompilierung mithilfe des COMPATIBILITY MODE-Flags aufgerufen werden, das pro Kompilierungsbasis angegeben werden kann.
Die shadermodell 4.0 spezifische HLSL-Sprachsemantik und systeminterne Funktionen für Direct3D 10 finden Sie unter HLSL. Wichtige Änderungen an der Syntax von Direct3D 9 HLSL, um die größte Benachrichtigung zu erhalten, befinden sich im Bereich des Texturzugriffs. Die neue Syntax ist das einzige Formular, das vom Compiler außerhalb des Kompatibilitätsmodus unterstützt wird.
Hinweis
Die Direct3D 10-Compilertyp-APIs (D3D10CompileShader und D3D10CompileEffectFromMemory) werden von direct3D 10, 10.1 und 11 Laufzeiten bereitgestellt, die in Windows Vista und höher ausgeführt werden. Die Direct3D 10-Compilertyp-APIs verfügen über die gleiche Funktionalität wie der HLSL-Compiler, der im DirectX SDK (Dezember 2006) ausgeliefert wird. Dieser HLSL-Compiler unterstützt die Direct3D 10.1-Profile (vs_4_1, ps_4_1, gs_4_1, fx_4_1) nicht und fehlt eine Reihe von Optimierungen und Verbesserungen. Sie können einen HLSL-Compiler abrufen, der die Direct3D 10.1-Profile aus der neuesten älteren DirectX SDK-Version unterstützt. Informationen zum älteren 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 ist jedoch in Direct3D 9 sehr ähnlich wie in Direct3D 10, es ist wichtig, die Shadereingabesignatur für die spätere Verwendung beizubehalten. Die Signatur wird standardmäßig als Teil des Shader-Blobs zurückgegeben, kann jedoch extrahiert werden, um die Speicheranforderungen bei Bedarf zu verringern. Weitere Informationen finden Sie unter Verwenden von Shadern in Direct3D 10.
Shader Reflection Layer Interface
Die Shaderreflektionsebene ist die Schnittstelle, über die Informationen zu den Shaderanforderungen abgerufen werden können. Dies ist besonders hilfreich beim Erstellen von Eingabeassemblyverknüpfungen (siehe unten), bei denen Sie möglicherweise die Eingabeanforderungen des Shaders durchlaufen müssen, um sicherzustellen, dass Sie die richtige Eingabestruktur für den Shader bereitstellen. Sie können gleichzeitig eine Instanz der Spiegelungsebenenschnittstelle erstellen, während Sie eine Instanz eines kompilierten Shaders erstellen.
Die Shaderreflektionsebene ersetzt D3DX9-Methoden, die ähnliche Funktionen bereitstellen. Beispielsweise wird IsParameterUsed durch die GetDesc-Methode ersetzt.
Layouts des Eingabeassemblers – Vertex-Shader /Eingabedatenstromverknüpfung
Der Eingabeassembler (Input Assembler, IA) ersetzt die Vertex-Streamdeklaration im Direct3D 9-Stil und die Beschreibungsstruktur ist in Form sehr ähnlich. Der Hauptunterschied, den die IA bietet, besteht darin, dass das erstellte IA-Layoutobjekt direkt einem bestimmten Format der Shadereingabesignatur zugeordnet werden muss. Das zum Verknüpfen des Eingabedatenstroms mit shader erstellte Zuordnungsobjekt kann für eine beliebige Anzahl von Shadern verwendet werden, bei denen die Shadereingabesignatur mit dem des Shaders übereinstimmt, der zum Erstellen des Eingabelayouts verwendet wurde.
Um die Pipeline mit statischen Daten optimal zu steuern, sollten Sie die Permutationen des Eingabedatenstromformats auf mögliche Shadereingabesignaturen berücksichtigen und die IA-Layoutobjektinstanzen so früh wie möglich erstellen und nach Möglichkeit wiederverwenden.
Auswirkungen der Deaktivierung von Shader-Code
Im folgenden Abschnitt wird ein erheblicher Unterschied zwischen Direct3D 9 und Direct3D 10 erläutert, der wahrscheinlich eine sorgfältige Behandlung in Ihrem Modulcode erfordert. Shader, die bedingte Ausdrücke enthalten, weisen häufig bestimmte Codepfade im Rahmen des Kompilierungsprozesses auf. In Direct3D 9 können zwei Arten von Eingaben entfernt werden (zum Entfernen markiert), wenn sie nicht verwendet werden: Signatureingaben (wie im folgenden Beispiel) und konstanten Eingaben. 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 von Direct3D 10 mit einer speziellen Ausnahme im Fall nicht verwendeter Konstanteneingaben am Ende eines Konstantenpuffers. Dies kann sich auf das Modul auswirken, wenn große Shader verarbeitet und Eingabelayouts erstellt werden. Elemente, die von inaktiven Codeoptimierungen im Compiler entfernt werden, müssen weiterhin in der Eingabestruktur deklariert werden. Dies wird im folgenden Beispiel veranschaulicht:
Beispiel für eine Vertex-Shader-Eingabestruktur
struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};
* Direct3D 9 dead code removal would remove the declaration in the shader due to conditional dead code removal
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 noch deutlicher machen, dass die Konstante eine Kompilierungszeitkonstante mit der folgenden Deklaration ist:
#define LIGHT_MAPPED false
Im obigen Beispiel würde das uv2-Element unter Direct3D 9 aufgrund von Optimierungen von totem Code im Compiler entfernt. Unter Direct3D 10 wird der inaktive Code weiterhin entfernt, aber das Layout des Shadereingabeassemblers erfordert die Definition der Eingabedaten. Die Shaderreflektionsebene bietet die Möglichkeit, diese Situation auf generische Weise zu behandeln, mit der Sie die Anforderungen der Shadereingabe durchlaufen und sicherstellen können, dass Sie eine vollständige Beschreibung der Eingabedatenstrom-Zuordnung zum Shadersignatur bereitstellen.
Hier ist eine Beispielfunktion, um das Vorhandensein eines semantischen Namens/Indexes 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;
}
Erstellung des State-Objekts
Beim Portieren von Modulcode kann es hilfreich sein, zunächst einen Standardsatz von Zustandsobjekten zu verwenden und alle Direct3D 9-Geräterenderingstatus-/Texturzustandseinstellungen zu deaktivieren. Dies führt zum Rendern von Artefakten, ist aber die schnellste Möglichkeit, Dinge in Betrieb zu nehmen. Sie können später ein Zustandsobjektverwaltungssystem erstellen, das einen zusammengesetzten Schlüssel verwenden kann, um die 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 speichern (z . B. D3DX10CreateTextureFromFile), unterstützen einen anderen Satz von Dateiformaten in Direct3D 10 als in Direct3D 9:
Dateiformat | Direct3D 9 | Direct3D 10 |
---|---|---|
.bmp | ja | ja |
.jpg | ja | ja |
.tga | ja | |
.png | ja | ja |
.dds | ja | ja |
.Ppm | ja | |
.dib | ja | |
.Hdr | ja | |
PFM | ja | |
.tiff | ja | |
.gif | ja | |
.tif | ja |
Weitere Informationen erhalten Sie, wenn Sie die Direct3D 9-D3DXIMAGE_FILEFORMAT Enumerationen mit den D3DX10_IMAGE_FILE_FORMAT Enumerationen für Direct3D 10 vergleichen.
Hinweis
Die Hilfsprogrammbibliothek D3DX (D3DX 9, D3DX 10 und D3DX 11) ist für Windows 8 veraltet. Für die Texturdateiverarbeitung wird empfohlen, DirectXTex zu verwenden.
Zuordnen von Texturformaten
Die folgende Tabelle zeigt die Zuordnung von Texturformaten von Direct3D 9 zu Direct3D 10. Alle Inhalte in Formaten, die in DXGI nicht verfügbar sind, müssen von Hilfsroutinen 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 in 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 zu den 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 skaliert, dies kann jedoch 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 skaliert, dies kann jedoch 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-/Hardwareperspektive gleich... Nur der 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-/Hardwareperspektive gleich... Nur der 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 integrale Floats im Direct3D 9-Stil erforderlich sind (0,0f, 1,0f... 255.f), UINT kann 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-Laufzeit enthalten ist, enthält BGRA-Formate. Die Unterstützung für diese Formate ist jedoch für Direct3D 10- und 10.1-Geräte mit Treibern optional, die für das Windows Display Driver Model (WDDM) für Windows Vista (WDDM 1.0) implementiert sind. Verwenden Sie stattdessen DXGI_FORMAT_R8G8B8A8_UNORM. Alternativ können Sie Ihr Gerät mit D3D10_CREATE_DEVICE_BGRA_SUPPORT erstellen, um sicherzustellen, dass Nur Computer mit der Direct3D 11.0-Laufzeit und einem WDDM 1.1-Treiber oder höher installiert werden.
²DXGI 1.0 hat 5:6:5 und 5:5:5:1-Formate definiert, aber sie wurden von der Direct3D 10.x- oder Direct3D 11.0-Laufzeit nicht unterstützt. Diese Formate werden optional mit DXGI 1.2 in der DirectX 11.1-Laufzeit unterstützt, die für Videoadapter der Featureebene 11.1 und WDDM 1.2 (Anzeigetreibermodell ab Windows 8) erforderlich ist und bereits auf 10level9-Featureebenen unterstützt wird.
¹DXGI 1.2 führte das Format 4:4:4:4:4 ein. Dieses Format wird optional in der DirectX 11.1-Laufzeit unterstützt, die für Featureebene 11.1-Grafikkarten und WDDM 1.2-Treiber erforderlich ist und bereits auf 10level9-Featureebenen unterstützt wird.
Bei nicht komprimierten Formaten 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 ein Schwenken vorhandener Ressourcenpixelformate. Es wird empfohlen, nach Möglichkeit als Offlinevorprozessdurchlauf zu berechnen.
Portieren von Shadern
Direct3D 10-Shader werden in HLSL erstellt
Direct3D 10 schränkt die Verwendung der Assemblysprache nur auf debuggingzwecke 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-Laufzeit auch die Anforderungen für die Phasenverbindung 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. Zum 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 - obwohl der Pixelshader 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, die Eingaben der Zielphasen können ein Präfix der Werte sein, die ausgegeben werden. Im obigen Beispiel könnte der Pixelshader position und texcoord1 als einzige Eingaben haben, aber er konnte nicht die Position und texcoord2 als einzige Eingaben aufgrund der Sortiereinschränkungen haben.
HLSL-Shaderstufenverknüpfungen
Die Verknüpfung zwischen Shadern kann an einem der folgenden Punkte in der Pipeline auftreten:
- Eingabeassembler in Vertex-Shader
- Vertex-Shader zu Pixelshader
- Vertex-Shader zu Geometry-Shader
- Vertex-Shader zur Streamausgabe
- Geometrie-Shader zu Pixelshader
- Geometry-Shader zum Streamen
Konstantenpuffer
Für eine einfache Portierung von Inhalten von 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. Es ist wichtig, dass die Leistung Konstanten nach der erwarteten Aktualisierungshäufigkeit in Puffer anordnen kann. Diese Organisation reduziert die Menge redundanter Konstantensätze auf ein Minimum.
Benutzerclipebenen in HLSL auf Featureebene 9 und höher
Ab Windows 8 können Sie das Clipplanes-Funktionsattribute in einer HLSL-Funktionsdeklaration anstelle von SV_ClipDistance verwenden, um den Shader auf Featureebene 9_x sowie featureebene 10 und höher zu bearbeiten. 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 Float-Eingabe verfügen. Andernfalls ist ein ganzzahliger Typ die Bitmusterdarstellung des Gleitkommawerts. Ein ganzzahliger Typ ist für eine Pixelshadereingabe nicht zulässig, es sei denn, der Wert ist für keine Interpolation markiert (siehe Interpolationsmodifizierer).
Mauscursor
In früheren Versionen von Windows wurden die standardmäßigen GDI-Mauscursorroutinen nicht ordnungsgemäß auf allen exklusiven Vollbildgeräten ausgeführt. Die ApIs "SetCursorProperties", "ShowCursor" und "SetCursorPosition" wurden hinzugefügt, um diese Fälle zu behandeln. Da die Version von GDI von Windows Vista DXGI-Oberflächen vollständig versteht, ist diese spezielle Mauscursor-API nicht erforderlich, sodass keine Direct3D 10-Entsprechung vorhanden ist. Direct3D 10-Anwendungen sollten stattdessen die standardmäßigen GDI-Mauscursorroutinen für Mauscursor verwenden.
Zuordnen von Texeln zu Pixeln in Direct3D 10
In Direct3D 9 waren Texelzente und Pixelzentrierungen eine halbe Einheit auseinander (siehe direkte Zuordnung von Texeln zu Pixeln (Direct3D 9)). In Direct3D 10 befinden sich Texelzentren bereits bei halben Einheiten, daher ist es überhaupt nicht erforderlich, Vertexkoordinaten zu verschieben.
Das Rendern von Quads im Vollbildmodus ist mit Direct3D 10 einfacher. Quads im Vollbildmodus sollten im Clipspace (-1,1) definiert und einfach ohne Änderungen durch den Vertex-Shader übergeben werden. 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 Pixelshader, um die Texturkoordinaten zu bearbeiten.
Änderungen des Referenzzählverhaltens
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 Referenzanzahl des Objekts auf Null fällt, wird das Objekt bei der Zerstörung von der Pipeline ungebunden. Diese Art der Referenzhaltung wird auch als Schwachverweishalter bezeichnet. Daher enthält jede Bindungsposition im Device-Objekt einen schwachen Verweis auf die Schnittstelle/das Objekt. Sofern nicht explizit anders erwähnt, sollte dieses Verhalten für alle Set-Methoden verwendet werden. Wenn die Zerstörung eines Objekts bewirkt, dass ein Bindungspunkt auf NULL festgelegt wird, gibt die Debugebene eine Warnung aus. Beachten Sie, dass Aufrufe von Device Get-Methoden wie OMGetRenderTargets die Referenzanzahl der zurückgegebenen Objekte erhöhen.
Kooperativ testen
Die Funktionalität der Direct3D 9-API TestCooperativeLevel entspricht dem Festlegen der DXGI_PRESENT_TEST beim Aufrufen von Present.
StretchRect
Eine Funktion, die der Direct3D 9 IDirect3DDevice9::StretchRect-Methode ähnelt, ist in Direct3D 10 und 10.1 nicht verfügbar. Um Ressourcenoberflächen zu kopieren, verwenden Sie ID3D10Device::CopySubresourceRegion. Für Größenänderungsvorgänge rendern Sie 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 Nebenupdate für Direct3D 10 und Direct3D 10.1, das die folgenden zusätzlichen Hardwarefeatures verfügbar gemacht hat:
- MSAA pro Beispiel-Shader
- MSAA-Tiefenlesevorgang
- Unabhängige Blendmodi pro Renderziel
- Cubezuordnungsarrays
- Rendern in blockkomprimierten (BC)-Formaten
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 enthält auch die folgenden zusätzlichen Strukturen:
Die Direct3D 10.1-API enthält ein neues Konzept namens 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 wird, können Anwendungen ein Direct3D 10.1-Gerät erstellen und dann als Direct3D 10.0-Gerät verwenden, es sei denn, neue 10.1-spezifische Features werden benötigt (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 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 Nebenupdate für die Direct3D 10.1-API, die in der Direct3D 11-Laufzeit enthalten ist. Dieses Update bietet Unterstützung für die folgenden Featureebenen:
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 der D3D10_FEATURE_LEVEL1-Enumeration.
Zugehörige Themen