離線編譯
效果編譯器工具 (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的參考頁面。