效果編譯程式工具 (fxc.exe) 是專為離線編譯 HLSL 著色器所設計。
使用目前的編譯程式進行編譯
目前編譯程式支援的著色器模型會顯示在 Profiles中。 此範例會編譯著色器模型 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 選項影響的行為。
在子程式中使用效果編譯程式工具
如果 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的參考頁面。