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.