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.