次の方法で共有


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 で終わる定数文字列へのポインター。 効果をコンパイルすると、D3DCompile2pEntrypoint を無視します。呼び出された関数で使用されない場合は、ポインター パラメーターを NULL に設定することをお勧めします。pEntrypointNULL に設定することをお勧めします。

[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 パラメーターが指すセカンダリ データ内のテンプレートが一致するように要求します。

pSecondaryDataNULL の場合は、0 に設定します。

[in, optional] pSecondaryData

種類: LPCVOID

セカンダリ データへのポインター。 セカンダリ データを渡さない場合は、NULL に設定 します。 このセカンダリ データを使用して、2 つのシェーダーで UAV スロットを配置します。 シェーダー A に UAV があり、一部のスロットにバインドされているとします。 同じ名前の UAV が A と同じスロットに B にマップされるようにシェーダー B をコンパイルするには、A のバイト コードをセカンダリ データとして D3DCompile2 に渡します。

[in] SecondaryDataSize

種類: SIZE_T

pSecondaryData が指すメモリ ブロックのサイズ (バイト単位)。 pSecondaryDataNULL の場合は、0 に設定します。

[out] ppCode

種類: ID3DBlob**

コンパイル済みコードへのアクセスに使用できる ID3DBlob インターフェイスへのポインターを受け取る変数へのポインター。

[out, optional] ppErrorMsgs

種類: ID3DBlob**

コンパイラ エラー メッセージへのアクセスに使用できる ID3DBlob インターフェイスへのポインターを受け取る変数へのポインター。エラーがない場合は NULL

戻り値

型: HRESULT

Direct3D 11 のリターン コードのいずれかを返します

注釈

D3DCompile2D3DCompile の違いは、D3DCompile2 がバイトコードの生成方法の一部の側面を制御するために使用できる省略可能なパラメーター (SecondaryDataFlagspSecondaryDataSecondaryDataSize) を受け取る点です。 詳細については、これらのパラメーターの説明を参照してください。 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

関連項目