Compilação offline

A ferramenta do compilador de efeito (fxc.exe) foi projetada para compilação offline de sombreadores HLSL.

Compilando com o compilador atual

Os modelos de sombreador compatíveis com o compilador atual são mostrados em Perfis. Este exemplo compila um sombreador de pixel para o destino do modelo de sombreador 5.1.

fxc /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Neste exemplo:

  • ps_5_1 é o perfil de destino.
  • PixelShader1.fxc é o arquivo de objeto de saída que contém o sombreador compilado.
  • PixelShader1.hlsl é a origem.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

As opções de depuração incluem opções adicionais para desabilitar otimizações do compilador (Od) e habilitar informações de depuração (Zi), como números de linha e símbolos.

Para obter uma listagem completa das opções de linha de comando, consulte a página Sintaxe .

Compilando com o compilador herdado

A partir do Direct3D 10, não há mais suporte para alguns modelos de sombreador. Isso inclui modelos de sombreador de pixel: ps_1_1, ps_1_2, ps_1_3 e ps_1_4 que dão suporte a recursos muito limitados e dependem de hardware. O compilador foi reprojetado com o modelo de sombreador 2 (ou superior), o que permite maior eficiência com a compilação. Isso, é claro, exigirá que você esteja executando em hardware que dê suporte aos modelos de sombreador 2 e superiores.

Observe também que você deve consultar as notas de versão do SDK associadas à sua versão do compilador FXC para obter o comportamento afetado pela opção /Gec.

Usando a ferramenta do compilador de efeito em um subprocesso

Se fxc.exe for gerado como um subprocesso por um aplicativo, é importante garantir que o aplicativo verifique e leia quaisquer dados em pipes de saída ou de erro passados para a função CreateProcess. Se o aplicativo aguardar apenas a conclusão do subprocesso e um dos pipes ficar cheio, o subprocesso nunca será concluído.

O código de exemplo a seguir ilustra a espera em um subprocesso e a leitura dos pipes de saída e de erro anexados ao subprocesso. O conteúdo da WaitHandles matriz corresponde a identificadores para o subprocesso, o pipe para stdout e o pipe para 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;
}

Para obter informações adicionais sobre como gerar um processo, consulte a página de referência de CreateProcess.