Partilhar via


Compilação offline

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

Compilando com o compilador atual

Os modelos de sombreador suportados pelo compilador atual são mostrados em Profiles. 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 alvo.
  • PixelShader1.fxc é o arquivo de objeto de saída que contém o sombreador compilado.
  • PixelShader1.hlsl é a fonte.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

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

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

Compilando com o compilador herdado

A partir do Direct3D 10, alguns modelos de sombreador não são mais suportados. Estes incluem modelos de sombreador de pixel: ps_1_1, ps_1_2, ps_1_3 e ps_1_4 que suportam recursos muito limitados e dependem de hardware. O compilador foi redesenhado com shader model 2 (ou superior), o que permite maior eficiência com a compilação. Isso, é claro, exigirá que você esteja executando em hardware que suporte 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 o comportamento afetado pela opção /Gec.

Usando a ferramenta effect-compiler como subprocesso

Se fxc.exe for gerado como um subprocesso por um aplicativo, é importante garantir que o aplicativo verifique e leia todos os dados nos pipes de saída ou de erro passados para a função CreateProcess. Se a aplicação apenas esperar que o subprocesso termine e um dos tubos ficar cheio, o subprocesso nunca terminará.

O código de exemplo a seguir ilustra a espera por um subprocesso e a leitura dos tubos de saída e erro anexados ao subprocesso. O conteúdo da matriz WaitHandles corresponde às alças para o subprocesso, o tubo para stdout e o tubo 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 do CreateProcess.