シェーダーのコンパイル

Note

このトピックでは、 FXC.EXE シェーダー モデル 2 から 5.1 で使用されるコンパイラについて説明します。 シェーダー モデル 6 の場合は、代わりに を使用 DXC.EXE します。これは、「 dxc.exe と dxcompiler.dllの使用 」に記載されています。 VISUAL Studio は、HLSL プロパティ ページ構成でシェーダー モデル 6 が選択されている場合に自動的に使用 DXC.EXE されます。

Microsoft Visual Studio では、C++ プロジェクトに含める *.hlsl ファイルと *.fx ファイルからシェーダー コードをコンパイルできます。

ビルド プロセスの一環として、Visual Studio では 、HLSL コード コンパイラfxc.exeまたは dxc.exe を使用して、HLSL シェーダー ソース ファイルをバイナリ シェーダー オブジェクト ファイルまたはヘッダー ファイルで定義されたバイト配列にコンパイルします。 HLSL コード コンパイラがプロジェクト内の各シェーダー ソース ファイルをコンパイルする方法は、そのファイルの Ouput Files プロパティを指定する方法によって異なります。 HLSL プロパティ ページの詳細については、「 HLSL プロパティ ページ」を参照してください。

通常、使用するコンパイル メソッドは、HLSL シェーダー ソース ファイルのサイズによって異なります。 ヘッダーに大量のバイト コードを含める場合は、アプリのサイズと初期読み込み時間を増やします。 また、シェーダーが作成された後でも、すべてのバイト コードがメモリ内に強制的に存在するため、リソースが無駄になります。 ただし、ヘッダーにバイト コードを含めると、コードの複雑さを軽減し、シェーダーの作成を簡略化できます。

シェーダー コードをコンパイルするさまざまな方法と、シェーダー コードのファイル拡張子に関する規則を見てみましょう。

シェーダー コード ファイル拡張子の使用

Microsoft の規則に準拠するには、シェーダー コードに次のファイル拡張子を使用します。

  • 拡張子が .hlsl のファイルには、高レベル の網かけ言語 (HLSL) ソース コードが含まれています。 以前の .fx 拡張機能もサポートされていますが、通常は 従来の効果システムに関連付けられています。
  • .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 のシェーダー コードをコンパイルすることもできます。 これを行う方法の詳細については、「 方法: シェーダーをコンパイルする」を参照してください。

Note

Windows ストア アプリでは、 D3DCompileFromFile を開発に使用できますが、展開には使用できません。

 

HLSL 用プログラミング ガイド

HLSL 用プログラミング ガイド