D3DCompile2 関数 (d3dcompiler.h)
Microsoft High Level Shader Language (HLSL) コードを特定のターゲットのバイトコードにコンパイルします。
構文
HRESULT D3DCompile2(
[in] LPCVOID pSrcData,
[in] SIZE_T SrcDataSize,
[in, optional] LPCSTR pSourceName,
[in, optional] const D3D_SHADER_MACRO *pDefines,
[in, optional] ID3DInclude *pInclude,
[in] LPCSTR pEntrypoint,
[in] LPCSTR pTarget,
[in] UINT Flags1,
[in] UINT Flags2,
[in] UINT SecondaryDataFlags,
[in, optional] LPCVOID pSecondaryData,
[in] SIZE_T SecondaryDataSize,
[out] ID3DBlob **ppCode,
[out, optional] ID3DBlob **ppErrorMsgs
);
パラメーター
[in] pSrcData
種類: LPCVOID
コンパイルされていないシェーダー データへのポインター (ASCII HLSL コード)。
[in] SrcDataSize
種類: SIZE_T
pSrcData が指すメモリ ブロックのサイズ (バイト単位)。
[in, optional] pSourceName
種類: LPCSTR
エラー メッセージで使用するソース データを識別する名前を含む、null で終わる定数へのオプションのポインター。 使用しない場合は、NULL に設定 します。
[in, optional] pDefines
型: const D3D_SHADER_MACRO*
シェーダー マクロを定義 するD3D_SHADER_MACRO 構造体の省略可能な配列。 各マクロ定義には、名前と null で終わる定義が含まれています。 使用しない場合は、NULL に設定 します。 配列内の最後の構造体はターミネータとして機能し、すべてのメンバーを NULL に設定する必要があります。
[in, optional] pInclude
種類: ID3DInclude*
コンパイラがインクルード ファイルの処理に使用する ID3DInclude インターフェイスへのポインター。 このパラメーターを NULL に設定し、シェーダーに #include が含まれている場合は、コンパイル エラーが発生します。 既定のインクルード ハンドラーへのポインターである D3D_COMPILE_STANDARD_FILE_INCLUDE マクロを渡すことができます。 この既定のインクルード ハンドラーには、現在のディレクトリに対して相対的なファイルと、初期ソース ファイルのディレクトリに対する相対ファイルが含まれます。 D3D_COMPILE_STANDARD_FILE_INCLUDEを使用する場合は、pSourceName パラメーターにソース ファイル名を指定する必要があります。コンパイラは pSourceName から初期相対ディレクトリを派生させます。
#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)
[in] pEntrypoint
種類: LPCSTR
シェーダーの実行が開始されるシェーダー エントリ ポイント関数の名前を含む、null で終わる定数文字列へのポインター。 効果をコンパイルすると、D3DCompile2 は pEntrypoint を無視します。呼び出された関数で使用されない場合は、ポインター パラメーターを NULL に設定することをお勧めします。pEntrypoint は NULL に設定することをお勧めします。
[in] pTarget
種類: LPCSTR
コンパイル対象のシェーダー ターゲットまたはシェーダー機能のセットを指定する、null で終わる定数文字列へのポインター。 シェーダー ターゲットには、シェーダー モデル (シェーダー モデル 2、シェーダー モデル 3、シェーダー モデル 4、シェーダー モデル 5 など) を指定できます。 ターゲットには、効果の種類 (たとえば、fx_4_1) を指定することもできます。 さまざまなプロファイルでサポートされるターゲットの詳細については、「 コンパイラ ターゲットの指定」を参照してください。
[in] Flags1
型: UINT
ビットごとの OR 演算を使用して結合されるシェーダー D3D コンパイル定数の組み合わせ。 結果の値は、コンパイラが HLSL コードをコンパイルする方法を指定します。
[in] Flags2
型: UINT
ビットごとの OR 演算を使用して結合される効果 D3D コンパイル効果定数の組み合わせ。 結果の値は、コンパイラによる効果のコンパイル方法を指定します。 効果ファイルではなくシェーダーをコンパイルすると、D3DCompile2 は Flags2 を無視します。Flags2 を 0 に設定することをお勧めします。呼び出された関数で使用されない場合は、非ポイント パラメーターを 0 に設定することをお勧めします。
[in] SecondaryDataFlags
型: UINT
ビットごとの OR 演算を使用して結合される、次のフラグの組み合わせ。 結果の値は、コンパイラが HLSL コードをコンパイルする方法を指定します。
フラグ | 説明 |
---|---|
D3DCOMPILE_SECDATA_MERGE_UAV_SLOTS (0x01) | pSecondaryData パラメーターが指すセカンダリ データ内の順序指定されていないアクセス ビュー (UAV) スロットをマージします。 |
D3DCOMPILE_SECDATA_PRESERVE_TEMPLATE_SLOTS (0x02) | pSecondaryData パラメーターが指すセカンダリ データ内のテンプレート スロットを保持します。 |
D3DCOMPILE_SECDATA_REQUIRE_TEMPLATE_MATCH (0x04) | コンパイラが HLSL コードをコンパイルするときに 、pSecondaryData パラメーターが指すセカンダリ データ内のテンプレートが一致するように要求します。 |
pSecondaryData が NULL の場合は、0 に設定します。
[in, optional] pSecondaryData
種類: LPCVOID
セカンダリ データへのポインター。 セカンダリ データを渡さない場合は、NULL に設定 します。 このセカンダリ データを使用して、2 つのシェーダーで UAV スロットを配置します。 シェーダー A に UAV があり、一部のスロットにバインドされているとします。 同じ名前の UAV が A と同じスロットに B にマップされるようにシェーダー B をコンパイルするには、A のバイト コードをセカンダリ データとして D3DCompile2 に渡します。
[in] SecondaryDataSize
種類: SIZE_T
pSecondaryData が指すメモリ ブロックのサイズ (バイト単位)。 pSecondaryData が NULL の場合は、0 に設定します。
[out] ppCode
種類: ID3DBlob**
コンパイル済みコードへのアクセスに使用できる ID3DBlob インターフェイスへのポインターを受け取る変数へのポインター。
[out, optional] ppErrorMsgs
種類: ID3DBlob**
コンパイラ エラー メッセージへのアクセスに使用できる ID3DBlob インターフェイスへのポインターを受け取る変数へのポインター。エラーがない場合は NULL 。
戻り値
型: HRESULT
Direct3D 11 のリターン コードのいずれかを返します。
注釈
D3DCompile2 と D3DCompile の違いは、D3DCompile2 がバイトコードの生成方法の一部の側面を制御するために使用できる省略可能なパラメーター (SecondaryDataFlags、pSecondaryData、SecondaryDataSize) を受け取る点です。 詳細については、これらのパラメーターの説明を参照してください。 D3DCompile2 と D3DCompile の間で生成されるバイトコードの効率に違いはありません。
UWP 用シェーダーのコンパイル
オフライン シェーダーをコンパイルするには、 Effect-compiler ツールを使用することをお勧めします。 すべてのシェーダーを事前にコンパイルできない場合は、よりコストの高いシェーダーと、スタートアップとパフォーマンスに依存するほとんどのパスに必要なものをコンパイルし、実行時に残りのシェーダーをコンパイルすることを検討してください。 次のようなプロセスを使用して、ユーザー インターフェイス スレッドをブロックすることなく、読み込まれたシェーダーまたは生成されたシェーダーを UWP アプリケーションでコンパイルできます。
Visual Studio 2015 以降を使用して UWP アプリを開発し、新しい項目 "shader.hlsl" を追加します。
- Visual Studio の [ソリューション フォルダー] ビューで、 shaders.hlsl 項目を選択し、[ プロパティ] を右クリックします。
- [ コンテンツ] 項目が [はい] に設定されていることを確認します。
- [アイテムの種類] が [テキスト] に設定されていることを確認します。
- ボタンを XAML に追加し、適切な名前を付け (この例では "TheButton" )、 Click ハンドラーを追加します。
次に、これらのインクルードを.cpp ファイルに追加します。
#include <ppltasks.h> #include <d3dcompiler.h> #include <Robuffer.h>
D3DCompile2 を呼び出すには、次のコードを使用します。 ここでエラー チェックや処理は行われません。また、このコードでは、I/O とコンパイルの両方をバックグラウンドで実行できることを示しているため、UI の応答性が向上します。
void App1::DirectXPage::TheButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
std::shared_ptr<Microsoft::WRL::ComPtr<ID3DBlob>> blobRef = std::make_shared<Microsoft::WRL::ComPtr<ID3DBlob>>();
// Load a file and compile it.
auto fileOp = Windows::ApplicationModel::Package::Current->InstalledLocation->GetFileAsync(L"shader.hlsl");
create_task(fileOp).then([this](Windows::Storage::StorageFile^ file) -> IAsyncOperation<Windows::Storage::Streams::IBuffer^>^
{
// Do file I/O in background thread (use_arbitrary).
return Windows::Storage::FileIO::ReadBufferAsync(file);
}, task_continuation_context::use_arbitrary())
.then([this, blobRef](Windows::Storage::Streams::IBuffer^ buffer)
{
// Do compilation in background thread (use_arbitrary).
// Cast to Object^, then to its underlying IInspectable interface.
Microsoft::WRL::ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(buffer));
// Query the IBufferByteAccess interface.
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
insp.As(&bufferByteAccess);
// Retrieve the buffer data.
byte *pBytes = nullptr;
bufferByteAccess->Buffer(&pBytes);
Microsoft::WRL::ComPtr<ID3DBlob> blob;
Microsoft::WRL::ComPtr<ID3DBlob> errMsgs;
D3DCompile2(pBytes, buffer->Length, "shader.hlsl", nullptr, nullptr, "main", "ps_5_0", 0, 0, 0, nullptr, 0, blob.GetAddressOf(), errMsgs.GetAddressOf());
*blobRef = blob;
}, task_continuation_context::use_arbitrary())
.then([this, blobRef]()
{
// Update UI / use shader on foreground thread.
wchar_t message[40];
swprintf_s(message, L"blob is %u bytes long", (unsigned)(*blobRef)->GetBufferSize());
this->TheButton->Content = ref new Platform::String(message);
}, task_continuation_context::use_current());
}
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | d3dcompiler.h |
Library | D3DCompiler.lib |
[DLL] | D3DCompiler_47.dll |