手記
このトピックでは、シェーダー モデル 2 から 5.1 に使用される FXC.EXE
コンパイラについて説明します。 シェーダーモデル6の場合は、代わりにDXC.EXE
を使用します。このことは、dxc.exeとdxcompiler.dllの使用に関するの記事で説明されています。 VISUAL Studio では、HLSL プロパティ ページ構成にシェーダー モデル 6 が選択されている場合、DXC.EXE
が自動的に使用されます。
Microsoft Visual Studio では、C++ プロジェクトに含める *.hlsl ファイルと *.fx ファイルからシェーダー コードをコンパイルできます。
Visual Studio は、ビルド プロセスの一環として、fxc.exe または dxc.exe HLSL コード コンパイラを使用して、HLSL シェーダー ソース ファイルをバイナリ シェーダー オブジェクト ファイルまたはヘッダー ファイルで定義されているバイト配列にコンパイルします。 HLSL コード コンパイラがプロジェクト内の各シェーダー ソース ファイルをコンパイルする方法は、そのファイルの Ouput Files プロパティを指定する方法によって異なります。 HLSL プロパティ ページの詳細については、「HLSL プロパティ ページ 」を参照してください。
通常、使用するコンパイル メソッドは、HLSL シェーダー ソース ファイルのサイズによって異なります。 ヘッダーに大量のバイト コードを含める場合は、アプリのサイズと初期読み込み時間を増やします。 シェーダーが作成された後でも、すべてのバイト コードをメモリに強制的に配置すると、リソースが無駄になります。 ただし、ヘッダーにバイト コードを含めると、コードの複雑さを軽減し、シェーダーの作成を簡略化できます。
シェーダー コードをコンパイルするさまざまな方法と、シェーダー コードのファイル拡張子の規則を見てみましょう。
- シェーダーコードのファイル拡張子を使用する
- ビルド時にオブジェクト ファイルにコンパイル
- ビルド時にヘッダーファイルにコンパイルする
- D3DCompileFromFile を使用したコンパイル
- 関連トピック
- 関連トピック
シェーダー コード ファイル拡張子の使用
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 のシェーダー コードをコンパイルすることもできます。 これを行う方法の詳細については、「方法: シェーダーをコンパイルする」を参照してください。
手記
Windows ストア アプリでは、開発用 D3DCompileFromFile の使用がサポートされますが、展開にはサポートされません。
関連トピック
HLSL の プログラミング ガイド
関連トピック
-
HLSL の プログラミング ガイド