D3DCompile2 函式 (d3dcompiler.h)

將 Microsoft 高階著色器語言 (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 宏,這是預設 include 處理程式的指標。 此預設包含處理程式包含相對於目前目錄的檔案,以及相對於初始原始程式檔目錄的檔案。 當您使用 D3D_COMPILE_STANDARD_FILE_INCLUDE 時,必須在 pSourceName 參數中指定來源檔名;編譯程式會從 pSourceName 衍生初始相對目錄。

#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)

[in] pEntrypoint

類型: LPCSTR

常數 Null 終止字串的指標,其中包含著色器執行開始之著色器進入點函式的名稱。 當您編譯效果時, D3DCompile2 會忽略 pEntrypoint;我們建議您將 pEntrypoint 設定為 NULL ,因為如果呼叫的函式不會使用它,最好是將指標參數設定為 NULL

[in] pTarget

類型: LPCSTR

常數 Null 終止字串的指標,指定要編譯的著色器目標或著色器功能集。 著色器目標可以是著色器模型 (例如著色器模型 2、著色器模型 3、著色器模型 4 或著色器模型 5) 。 例如,目標也可以是效果類型 (,例如fx_4_1) 。 如需各種配置檔支援的目標相關信息,請參閱 指定編譯程序目標

[in] Flags1

類型: UINT

著色器 D3D 編譯常數 的組合,使用位 OR 運算結合。 產生的值會指定編譯程式如何編譯 HLSL 程式代碼。

[in] Flags2

類型: UINT

效果 D3D 編譯效果常數 的組合,使用位 OR 運算結合。 產生的值會指定編譯程式如何編譯效果。 當您編譯著色器而非效果檔案時, D3DCompile2 會忽略 Flags2;我們建議您將 Flags2 設定為零,因為如果呼叫的函式不會使用它,則良好的程式設計做法是將非pointer 參數設定為零。

[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) 要求 pSecondaryData 參數在編譯 HLSL 程式代碼時,次要數據中的範本必須相符。

如果 pSecondaryDataNULL,請將 設定為零。

[in, optional] pSecondaryData

類型: LPCVOID

次要數據的指標。 如果您未傳遞次要數據,請將 設定為 NULL。 使用此次要數據來對齊兩個著色器中的 UAV 位置。 假設著色器 A 具有 UAV,且它們系結至某些位置。 若要編譯著色器 B,讓具有相同名稱的UAV 對應至與 A 中相同的位置,請將 A 的位元組程式代碼傳遞至 D3DCompile2 做為次要數據。

[in] SecondaryDataSize

類型: SIZE_T

pSecondaryData 所指向記憶體區塊的大小,以位元組為單位。 如果 pSecondaryDataNULL,請將 設定為零。

[out] ppCode

類型: ID3DBlob**

可接收 ID3DBlob 介面指標的變數指標,可用來存取編譯的程序代碼。

[out, optional] ppErrorMsgs

類型: ID3DBlob**

可接收 ID3DBlob 介面指標的變數指標,您可以用來存取編譯程式錯誤訊息,如果沒有錯誤,則為 NULL

傳回值

類型: HRESULT

傳回其中一個 Direct3D 11 傳回碼

備註

D3DCompile2 與 D3DCompile 之間的差異在於 D3DCompile2 會採用一些選擇性參數 (SecondaryDataFlagspSecondaryDataSecondaryDataSize) ,可用來控制位元組程式代碼產生方式的某些層面。 如需詳細資訊,請參閱這些參數的描述。 否則,在 D3DCompile2D3DCompile2 之間產生的位元組程式代碼效率沒有差異。

編譯UWP的著色器

若要編譯脫機著色器,建議的方法是使用 Effect-compiler 工具。 如果您無法事先編譯所有著色器,請考慮編譯成本較高的著色器,以及您的啟動和大部分效能敏感性路徑所需的著色器,並在運行時間編譯其餘部分。 您可以使用類似下列的程式,在UWP應用程式中編譯載入或產生的著色器,而不會封鎖您的使用者介面線程。

  • 使用 Visual Studio 2015+ 開發 UWP 應用程式,新增專案 “shader.hlsl”。

    • 在 Visual Studio 的 [ 方案資料夾 ] 檢視中,選取 著色器.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
程式庫 D3DCompiler.lib
Dll D3DCompiler_47.dll

請參閱