Compilazione offline
Lo strumento del compilatore di effetti (fxc.exe) è progettato per la compilazione offline di shader HLSL.
Compilazione con il compilatore corrente
I modelli di shader supportati dal compilatore corrente sono visualizzati in Profili. Questo esempio compila un pixel shader per la destinazione del modello di shader 5.1.
fxc /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl
Esempio:
- ps_5_1 è il profilo di destinazione.
- PixelShader1.fxc è il file oggetto di output contenente lo shader compilato.
- PixelShader1.hlsl è l'origine.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl
Le opzioni di debug includono opzioni aggiuntive per disabilitare le ottimizzazioni del compilatore (Od) e abilitare le informazioni di debug (Zi) come numeri di riga e simboli.
Per un elenco completo delle opzioni della riga di comando, vedere la pagina Sintassi .
Compilazione con il compilatore legacy
A partire da Direct3D 10, alcuni modelli di shader non sono più supportati. Questi includono modelli di pixel shader: ps_1_1, ps_1_2, ps_1_3 e ps_1_4 che supportano risorse molto limitate e dipendono dall'hardware. Il compilatore è stato riprogettato con il modello shader 2 (o versione successiva) che consente una maggiore efficienza con la compilazione. Questa operazione richiederà naturalmente l'esecuzione su hardware che supporta i modelli di shader 2 e versioni successive.
Si noti anche che è necessario consultare le note sulla versione dell'SDK associate alla versione del compilatore FXC per il comportamento interessato dall'opzione /Gec.
Uso dello strumento del compilatore di effetti in un sottoprocesso
Se fxc.exe viene generato come sottoprocesso da un'applicazione, è importante assicurarsi che l'applicazione controlli e legga i dati nell'output o nelle pipe di errore passati alla funzione CreateProcess. Se l'applicazione attende solo il completamento del sottoprocesso e una delle pipe diventa piena, il sottoprocesso non terminerà mai.
Il codice di esempio seguente illustra l'attesa di un sottoprocesso e la lettura dell'output e delle pipe di errore collegate al sottoprocesso. Il contenuto della WaitHandles
matrice corrisponde agli handle per il sottoprocesso, alla pipe per stdout e alla pipe per 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;
}
Per altre informazioni sulla generazione di un processo, vedere la pagina di riferimento per CreateProcess.