Freigeben über


Ü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

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;

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

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

CubeMap-Beispiel

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:

HLSL ohne Effektbeispiel

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, &paramDesc);
        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.

Programmierhandbuch für Direct3D 10