Share via


離線編譯

效果編譯器工具 (fxc.exe) 是專為離線編譯 HLSL 著色器所設計。

使用目前的編譯器進行編譯

目前編譯器支援的著色器模型會顯示在 設定檔中。 此範例會編譯著色器模型 5.1 目標的圖元著色器。

fxc /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

在此範例中:

  • ps_5_1是目標設定檔。
  • PixelShader1.fxc 是包含已編譯著色器的輸出物件檔。
  • PixelShader1.hlsl 是來源。
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

偵錯選項包含其他選項,可停用 Od) (編譯器優化,以及啟用 Zi) 偵錯 (資訊,例如行號和符號。

如需命令列選項的完整清單,請參閱 語法 頁面。

使用舊版編譯器進行編譯

從 Direct3D 10 開始,不再支援某些著色器模型。 其中包括圖元著色器模型:ps_1_1、ps_1_2、ps_1_3,以及支援非常有限的資源和相依于硬體的ps_1_4。 編譯器已重新設計著色器模型 2 (或更新) ,以提升編譯的效率。 當然,您必須在支援著色器模型 2 和更新版本的硬體上執行。

另請注意,您應該參閱與 FXC 編譯器版本相關聯的 SDK 版本資訊,以瞭解受 /Gec 參數影響的行為。

在子處理中使用 effect-compiler 工具

如果應用程式繁衍fxc.exe為子進程,請務必確保應用程式會檢查並讀取傳遞至 CreateProcess 函式的輸出或錯誤管道中的任何資料。 如果應用程式只等候子進程完成,而其中一個管道會變成滿,則子進程永遠不會完成。

下列範例程式碼說明等候子進程,並讀取附加至子進程之輸出和錯誤管道。 陣列的內容 WaitHandles 會對應至子進程控制碼、stdout 的管道,以及 stderr 的管道。

HANDLE WaitHandles[] = {
  piProcInfo.hProcess, hReadOutPipe, hReadErrorPipe
};

const DWORD BUFSIZE = 4096;
BYTE buff[BUFSIZE];

while (1)
{
    DWORD dwBytesRead, dwBytesAvailable;

    dwWaitResult = WaitForMultipleObjects(3, WaitHandles, FALSE, 60000L);

    // Read from the pipes...
    while (PeekNamedPipe(hReadOutPipe, NULL, 0, NULL, &dwBytesAvailable, NULL) && dwBytesAvailable)
    {
        ReadFile(hReadOutPipe, buff, BUFSIZE - 1, &dwBytesRead, 0);
        streamOut << std::string((char*)buff, (size_t)dwBytesRead);
    }
    while (PeekNamedPipe(hReadErrorPipe, NULL, 0, NULL, &dwBytesAvailable, NULL) && dwBytesAvailable)
    {
        ReadFile(hReadErrorPipe, buff, BUFSIZE - 1, &dwBytesRead, 0);
        streamError << std::string((char*)buff, (size_t)dwBytesRead);
    }

    // Process is done, or we timed out:
    if (dwWaitResult == WAIT_OBJECT_0 || dwWaitResult == WAIT_TIMEOUT)
        break;
}

如需繁衍進程的其他資訊,請參閱 CreateProcess的參考頁面。