Verwenden von Shadern in Direct3D 9

Kompilieren eines Shaders für bestimmte Hardware

Shader wurden microsoft DirectX in DirectX 8.0 zum ersten Mal hinzugefügt. Zu diesem Zeitpunkt wurden mehrere virtuelle Shadercomputer definiert, die ungefähr einem bestimmten Grafikprozessor entspricht, der von den top 3D-Grafikanbietern erzeugt wurde. Für jeden dieser virtuellen Shadercomputer wurde eine Assemblysprache entworfen. Programme, die in die Shadermodelle geschrieben wurden (Namen im Vergleich _ zu 1 1 und _ ps _ _ 1 1 - ps _ 1 _ 4), waren relativ kurz und wurden in der Regel von Entwicklern direkt in der entsprechenden Assemblysprache geschrieben. Die Anwendung würde diesen lesbaren Assemblysprachcode mit D3DXAssembleShader an die D3DX-Bibliothek übergeben und eine binäre Darstellung des Shaders erhalten, die wiederum mit CreateVertexShader oder CreatePixelShaderübergeben wird. Weitere Informationen finden Sie im Software Development Kit (SDK).

Die Situation in Direct3D 9 ist ähnlich. Eine Anwendung übergibt einen HLSL-Shader mit D3DXCompileShader an D3DX und ruft eine binäre Darstellung des kompilierten Shaders ab, die wiederum mit CreatePixelShader oder CreateVertexShaderan Microsoft Direct3D übergeben wird. Die Runtime weiß nichts über HLSL, sondern nur über die Shadermodelle für binäre Assemblys. Dies ist sehr gut, da der HLSL-Compiler unabhängig von der Direct3D-Runtime aktualisiert werden kann. Sie können Shader auch offline kompilieren, indem Sie fxc verwenden.

Zusätzlich zur Entwicklung des HLSL-Compilers wurden in Direct3D 9 auch shader-Modelle auf Assemblyebene eingeführt, um die Funktionalität der neuesten Generation von Grafikhardware verfügbar zu machen. Anwendungsentwickler können in der Assembly für diese neuen Modelle arbeiten _ (vs. 2 _ 0, vs _ 3 _ 0, ps _ 2 _ 0, ps 3 0), aber wir erwarten, dass die meisten Entwickler zur _ _ Shaderentwicklung zu HLSL wechseln.

Die Fähigkeit, ein HLSL-Programm zum Ausdrücken eines bestimmten Schattierungsalgorithmus zu schreiben, ermöglicht es natürlich nicht automatisch, auf einer bestimmten Hardware ausgeführt zu werden. Eine Anwendung ruft D3DX auf, um einen Shader mit D3DXCompileShaderin binären Assemblycode zu kompilieren. Eine der Einschränkungen bei diesem Einstiegspunkt ist ein Parameter, der definiert, welches der Modelle auf Assemblyebene (oder Kompilierungsziele) der HLSL-Compiler verwenden soll, um den endgültigen Shadercode auszudrücken. Wenn eine Anwendung die HLSL-Shaderkompilierung zur Laufzeit (im Gegensatz zur Kompilierzeit oder offline) vor sich geht, könnte die Anwendung die Funktionen des Direct3D-Geräts überprüfen und das zu übereinstimmende Kompilierungsziel auswählen. Wenn der im HLSL-Shader ausgedrückte Algorithmus für die Ausführung auf dem ausgewählten Kompilierungsziel zu komplex ist, ist die Kompilierung nicht erfolgreich. Dies bedeutet, dass HLSL zwar ein großer Vorteil für die Shaderentwicklung ist, entwickler aber nicht von der Verdringung von Spielen an eine Zielgruppe mit Grafikgeräten mit unterschiedlichen Funktionen frei macht. Als Spieleentwickler müssen Sie weiterhin einen mehrstufigen Ansatz für Ihre Visuals verwalten. dies bedeutet, bessere Shader für fähige Grafikkarten zu schreiben und grundlegendere Versionen für ältere Karten zu schreiben. Mit gut geschriebener HLSL kann diese Belastung jedoch erheblich verringert werden.

Anstatt HLSL-Shader mithilfe von D3DX auf dem Computer des Kunden zur Ladezeit der Anwendung oder bei der ersten Verwendung zu kompilieren, entscheiden sich viele Entwickler dafür, ihren Shader aus HLSL in binären Assemblycode zu kompilieren, bevor sie überhaupt geliefert werden. Dadurch wird der HLSL-Quellcode von den Augen entfernt, und es wird sichergestellt, dass alle Shader, die ihre Anwendung jemals ausführen wird, ihren internen Qualitätssicherungsprozess durchgegangen sind. Ein praktisches Hilfsprogramm zum Offline kompilieren von Shadern ist fxc. Dieses Tool verfügt über eine Reihe von Optionen, mit denen Sie Code für das angegebene Kompilierungsziel kompilieren können. Das Untersuchen der disassemblierten Ausgabe kann während der Entwicklung sehr lernreich sein, wenn Sie Ihre Shader optimieren oder einfach nur die Funktionen des virtuellen Shaders auf einer detaillierteren Ebene kennenlernen möchten. Diese Optionen sind unten zusammengefasst:

Initialisieren von Shaderkonst constants

Shaderkonst constants sind in der Konstantentabelle enthalten. Darauf kann mit der ID3DXConstantTable-Schnittstelle zugegriffen werden. Globale Shadervariablen können im Shadercode initialisiert werden. Diese werden zur Laufzeit durch Aufrufen von SetDefaults initialisiert.

Binden eines Shaderparameters an ein bestimmtes Register

Der Compiler weist globalen Variablen automatisch Register zu. Der Compiler weist Environment dem Samplerregister s0, SparkleNoise zum Samplerregister s1 und k s dem konstanten Register c0 zu (vorausgesetzt, es wurden noch keine anderen Sampler- oder Konstantenregister zugewiesen) für die folgenden drei globalen _ Variablen:

sampler Environment;
sampler SparkleNoise;
float4 k_s;

Es ist auch möglich, Variablen an ein bestimmtes Register zu binden. Verwenden Sie die folgende Syntax, um zu erzwingen, dass der Compiler einem bestimmten Register zugewiesen wird:

register(RegisterName)

Dabei steht RegisterName für den Namen des jeweiligen Registers. Die folgenden Beispiele veranschaulichen die spezifische Registerzuweisungssyntax, bei der die Samplerumgebung an das Samplerregister s1, SparkleNoise an das Samplerregister s0 und k s an das konstante Register _ c12 gebunden wird:

sampler Environment : register(s1);
sampler SparkleNoise : register(s0);
float4 k_s : register(c12);

Rendern eines programmierbaren Shaders

Ein Shader wird gerendert, indem der aktuelle Shader im Gerät, die Shaderkonstiven initialisiert, dem Gerät mitzuteilen wird, woher die unterschiedlichen Eingabedaten kommen, und schließlich die Primitiven gerendert werden. Jede dieser Methoden kann durch Aufrufen der folgenden Methoden erreicht werden:

Debuggen von Shadern

Die DirectX-Erweiterung für Microsoft Visual Studio .NET bietet einen vollständig integrierten HLSL-Debugger innerhalb der Visual Studio .NET Integrated Development Environment (IDE). Um das Shaderdebuggen vorzubereiten, müssen Sie die richtigen Tools auf Ihrem Computer installieren (siehe Debuggen von Shadern in Visual Studio (Direct3D 9)).

Programmieranleitung für HLSL