Share via


Kompilieren von Shadern

Hinweis

In diesem Thema wird der compiler behandelt, der FXC.EXE für Shadermodelle 2 bis 5.1 verwendet wird. Für Shadermodell 6 verwenden DXC.EXE Sie stattdessen, was unter Verwenden von dxc.exe und dxcompiler.dlldokumentiert ist. Visual Studio wird automatisch verwendet DXC.EXE , wenn Shadermodell 6 für die HLSL-Eigenschaftenseite-Konfiguration ausgewählt ist.

Microsoft Visual Studio kann Shadercode aus *.hlsl- und *.fx-Dateien kompilieren, die Sie in Ihr C++-Projekt einschließen.

Im Rahmen des Buildprozesses verwendet Visual Studio den fxc.exe oder dxc.exe HLSL-Codecompiler, um die HLSL-Shaderquelldateien in binäre Shaderobjektdateien oder in Bytearrays zu kompilieren, die in Headerdateien definiert sind. Wie der HLSL-Codecompiler jede Shaderquelldatei in Ihrem Projekt kompiliert, hängt davon ab, wie Sie die Ouput Files-Eigenschaft für diese Datei angeben. Weitere Informationen zu HLSL-Eigenschaftenseiten finden Sie unter HLSL-Eigenschaftenseiten.

Die kompilierte Methode, die Sie verwenden, hängt in der Regel von der Größe Ihrer HLSL-Shaderquelldatei ab. Wenn Sie eine große Menge an Bytecode in einen Header einschließen, erhöhen Sie die Größe und die anfängliche Ladezeit Ihrer App. Außerdem erzwingen Sie, dass sich der gesamte Bytecode im Arbeitsspeicher befindet, auch nachdem der Shader erstellt wurde, wodurch Ressourcen verschwendet werden. Wenn Sie jedoch Bytecode in einen Header einschließen, können Sie die Codekomplexität verringern und die Shadererstellung vereinfachen.

Sehen wir uns nun verschiedene Möglichkeiten zum Kompilieren von Shadercode und Konventionen für Dateierweiterungen für Shadercode an.

Verwenden von Shadercodedateierweiterungen

Um der Microsoft-Konvention zu entsprechen, verwenden Sie diese Dateierweiterungen für Ihren Shadercode:

  • Eine Datei mit der Erweiterung .hlsl enthält den Quellcode der High Level Shading Language (HLSL). Die ältere FX-Erweiterung wird ebenfalls unterstützt, ist aber in der Regel mit dem Legacy-Effects-System verknüpft.
  • Eine Datei mit der Erweiterung .cso enthält ein kompiliertes Shaderobjekt.
  • Eine Datei mit der Erweiterung .h ist eine Headerdatei, aber in einem Shadercodekontext definiert diese Headerdatei ein Bytearray, das Shaderdaten enthält. Andere gängige Erweiterungen für HLSL-Shadercodeheader sind .hlsli und .fxh.

Kompilieren zur Buildzeit in Objektdateien

Wenn Sie Ihre HLSL-Dateien in binäre Shaderobjektdateien kompilieren, muss Ihre App die Daten aus diesen Objektdateien lesen (CSO ist die Standarderweiterung für diese Objektdateien), die Daten Bytearrays zuweisen und Shaderobjekte aus diesen Bytearrays erstellen. Um beispielsweise einen Vertexshader (ID3D11VertexShader**) zu erstellen, rufen Sie die ID3D11Device::CreateVertexShader-Methode mit einem Bytearray auf, das kompilierten Vertexshader-Bytecode enthält. In diesem Beispielcode gibt die Ouput Files-Eigenschaft für die Datei SimpleVertexShader.hlsl an, in die SimpleVertexShader.cso-Objektdatei zu kompilieren.

        auto vertexShaderBytecode = ReadData("SimpleVertexShader.cso");
        ComPtr<ID3D11VertexShader> vertexShader;
        DX::ThrowIfFailed(
            m_d3dDevice->CreateVertexShader(
                vertexShaderBytecode->Data,
                vertexShaderBytecode->Length,
                nullptr,
                &vertexShader
                )

Das ReadData-Hilfsprogramm hier sucht im aktuellen Arbeitsverzeichnis sowie im selben Verzeichnis wie die EXE-Datei des aktuellen Prozesses, da die CSO-Dateien in der Regel zusammen mit anderen VS-Buildprodukten gefunden werden. Eine Beispielimplementierung finden Sie unter ReadData.h .

Kompilieren zur Buildzeit in Headerdateien

Wenn Sie Ihre HLSL-Dateien in Bytearrays kompilieren, die in Headerdateien definiert sind, müssen Sie diese Headerdateien in Ihren Code einschließen. In diesem Beispielcode gibt die Ouput Files-Eigenschaft für die PixelShader.hlsl-Datei an, dass in das g_psshader Bytearray kompiliert werden soll, das in der PixelShader.h-Headerdatei definiert ist.

namespace
{
       include "PixelShader.h"
}
...
        ComPtr<ID3D11PixelShader> m_pPixelShader;
        hr = pDevice->CreatePixelShader(g_psshader, sizeof(g_psshader), nullptr, &m_pPixelShader);

Kompilieren mit D3DCompileFromFile

Sie können auch die D3DCompileFromFile-Funktion zur Laufzeit verwenden, um Shadercode für Direct3D 11 zu kompilieren. Weitere Informationen dazu finden Sie unter Vorgehensweise: Kompilieren eines Shaders.

Hinweis

Windows Store-Apps unterstützen die Verwendung von D3DCompileFromFile für die Entwicklung, aber nicht für die Bereitstellung.

 

Programmieranleitung für HLSL

Programmieranleitung für HLSL