Kompilasi offline
Alat pengkompilasi efek (fxc.exe) dirancang untuk kompilasi offline shader HLSL.
Mengkompilasi dengan pengkompilasi saat ini
Model shader yang didukung oleh pengkompilasi saat ini ditampilkan di Profil. Contoh ini mengkompilasi shader piksel untuk target model shader 5.1.
fxc /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl
Dalam contoh ini:
- ps_5_1 adalah profil target.
- PixelShader1.fxc adalah file objek output yang berisi shader yang dikompilasi.
- PixelShader1.hlsl adalah sumbernya.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl
Opsi debug mencakup opsi tambahan untuk menonaktifkan pengoptimalan pengkompilasi (Od) dan mengaktifkan informasi debug (Zi) seperti nomor baris dan simbol.
Untuk daftar lengkap opsi baris perintah, lihat halaman Sintaks .
Mengkompilasi dengan pengkompilasi warisan
Dimulai dengan Direct3D 10, beberapa model shader tidak lagi didukung. Ini termasuk model piksel shader: ps_1_1, ps_1_2, ps_1_3, dan ps_1_4 yang mendukung sumber daya yang sangat terbatas dan bergantung pada perangkat keras. Kompiler telah dirancang ulang dengan model shader 2 (atau lebih besar) yang memungkinkan efisiensi yang lebih besar dengan kompilasi. Ini tentu saja akan mengharuskan Anda menjalankan perangkat keras yang mendukung model shader 2 dan yang lebih besar.
Perhatikan juga bahwa Anda harus berkonsultasi dengan catatan rilis SDK yang terkait dengan versi pengkompilasi FXC Anda untuk perilaku yang terpengaruh oleh sakelar /Gec.
Menggunakan alat pengkompilasi efek dalam subprosces
Jika fxc.exe ditelurkan sebagai subprosces oleh aplikasi, penting untuk memastikan bahwa aplikasi memeriksa dan membaca data apa pun dalam output atau pipa kesalahan yang diteruskan ke fungsi CreateProcess. Jika aplikasi hanya menunggu subproses selesai dan salah satu pipa menjadi penuh, subproses tidak akan pernah selesai.
Contoh kode berikut mengilustrasikan menunggu subproses dan membaca output dan pipa kesalahan yang melekat pada subproses. Konten WaitHandles
array sesuai dengan handel untuk subproses, pipa untuk stdout dan pipa untuk 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;
}
Untuk informasi tambahan tentang pemijahan proses, lihat halaman referensi untuk CreateProcess.