Share via


Compilación sin conexión

La herramienta del compilador de efectos (fxc.exe) está diseñada para la compilación sin conexión de sombreadores HLSL.

Compilación con el compilador actual

Los modelos de sombreador admitidos por el compilador actual se muestran en Perfiles. En este ejemplo se compila un sombreador de píxeles para el destino del modelo de sombreador 5.1.

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

En este ejemplo:

  • ps_5_1 es el perfil de destino.
  • PixelShader1.fxc es el archivo de objeto de salida que contiene el sombreador compilado.
  • PixelShader1.hlsl es el origen.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Las opciones de depuración incluyen opciones adicionales para deshabilitar las optimizaciones del compilador (Od) y habilitar la información de depuración (Zi), como números de línea y símbolos.

Para obtener una lista completa de las opciones de la línea de comandos, consulte la página Sintaxis .

Compilación con el compilador heredado

A partir de Direct3D 10, ya no se admiten algunos modelos de sombreador. Estos incluyen modelos de sombreador de píxeles: ps_1_1, ps_1_2, ps_1_3 y ps_1_4 que admiten recursos muy limitados y dependen del hardware. El compilador se ha rediseñado con el modelo de sombreador 2 (o superior), lo que permite una mayor eficiencia con la compilación. Esto, por supuesto, requerirá que se ejecute en hardware que admita modelos de sombreador 2 y versiones posteriores.

Tenga en cuenta también que debe consultar las notas de la versión del SDK asociadas a la versión del compilador FXC para conocer el comportamiento afectado por el modificador /Gec.

Uso de la herramienta del compilador de efectos en un subproceso

Si una aplicación genera fxc.exe como un subproceso, es importante asegurarse de que la aplicación comprueba y lee los datos de las canalizaciones de salida o error que se pasan a la función CreateProcess. Si la aplicación solo espera a que finalice el subproceso y una de las canalizaciones se llenará, el subproceso nunca finalizará.

En el código de ejemplo siguiente se muestra la espera en un subproceso y la lectura de las canalizaciones de salida y error adjuntas al subproceso. El contenido de la WaitHandles matriz corresponde a los identificadores del subproceso, la canalización para stdout y la canalización 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 obtener más información sobre cómo generar un proceso, consulte la página de referencia de CreateProcess.