編譯著色器

注意

本主題涵蓋 FXC.EXE 著色器模型 2 到 5.1 所使用的編譯器。 針對著色器模型 6,您可以改用 DXC.EXE ,其記載于 使用 dxc.exe 和 dxcompiler.dll。 選取 [HLSL 屬性頁] 組態的 [著色器模型 6] 時,Visual Studio 會自動使用 DXC.EXE

Microsoft Visual Studio 可以從您包含在 C++ 專案中的 *.hlsl 和 *.fx 檔案編譯著色器程式碼。

在建置過程中,Visual Studio 會使用 fxc.exedxc.exe HLSL 程式碼編譯器,將 HLSL 著色器原始程式檔編譯成二進位著色器物件檔案,或編譯成標頭檔中定義的位元組陣列。 HLSL 程式碼編譯器如何編譯專案中的每個著色器原始程式檔,取決於您指定該檔案的 Ouput Files 屬性的方式。 如需 HLSL 屬性頁的詳細資訊,請參閱 HLSL 屬性頁

您使用的編譯方法通常取決於 HLSL 著色器原始程式檔的大小。 如果您在標頭中包含大量的位元組程式碼,您可以增加應用程式的大小和初始載入時間。 您也會強制所有位元組程式碼位於記憶體中,即使建立著色器之後,也會浪費資源。 但是當您在標頭中包含位元組程式碼時,可以減少程式碼複雜度,並簡化著色器建立。

現在讓我們看看編譯著色器程式碼的各種方式,以及著色器程式碼副檔名的慣例。

使用著色器程式碼副檔名

若要符合 Microsoft 慣例,請針對著色器程式碼使用這些副檔名:

  • 副檔名為 .hlsl 的檔案會保留高階網底語言 (HLSL) 原始程式碼。 也支援較舊的 .fx 延伸模組,但通常與 舊版 Effects 系統相關聯。
  • 有 .Cso 副檔名的檔案會保留所使用的著色器物件。
  • 有 .h 副檔名的檔案是標頭檔案,但在著色器程式碼操作中,此標頭檔案定義位元組陣列,其保留著色器資料。 HLSL 著色器程式碼標頭的其他常見延伸模組包括 .hlsli 和 .fxh。

在建置階段編譯至物件檔

如果您將 .hlsl 檔案編譯成二進位著色器物件檔,您的應用程式必須從這些物件檔讀取資料, (.cso 是這些物件檔案的預設副檔名) 、將資料指派給位元組陣列,以及從這些位元組陣列建立著色器物件。 例如,若要建立頂點著色器 (ID3D11VertexShader**) ,請使用包含已編譯頂點著色器位元組程式碼的位元組陣列呼叫 ID3D11Device::CreateVertexShader 方法。 在此範例程式碼中,SimpleVertexShader.hlsl 檔案的 Ouput Files 屬性會指定要編譯成 SimpleVertexShader.cso 物件檔。

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

這裡的 ReadData 協助程式會查看目前的工作目錄,以及與目前進程 EXE 檔案相同的目錄,與 .cso 檔案通常會與其他 VS 組建產品一起找到。 如需範例實作,請參閱 ReadData.h

在建置階段編譯標頭檔

如果您將 .hlsl 檔案編譯成在標頭檔中定義的位元組陣列,則必須在程式碼中包含這些標頭檔。 在此範例程式碼中,PixelShader.hlsl 檔案的 Ouput Files 屬性會指定要編譯成 PixelShader.h 標頭檔中定義的 g_psshader 位元組陣列。

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

使用 D3DCompileFromFile 進行編譯

您也可以在執行時間使用 D3DCompileFromFile 函式來編譯 Direct3D 11 的著色器程式碼。 如需如何執行這項操作的詳細資訊,請參閱 如何:編譯著色器

注意

Windows 市集應用程式支援使用 D3DCompileFromFile 進行開發,但不支援部署。

 

HLSL 的程式設計指南

HLSL 的程式設計指南