Поделиться через


Автономная компиляция

Средство компилятора эффектов (fxc.exe) предназначено для автономной компиляции шейдеров HLSL.

Компиляция с помощью текущего компилятора

Модели шейдеров, поддерживаемые текущим компилятором, отображаются в разделе Профили. В этом примере компилируется пиксельный шейдер для целевой модели шейдера 5.1.

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

В этом примере:

  • ps_5_1 является целевым профилем.
  • PixelShader1.fxc — это выходной файл объекта, содержащий скомпилированный шейдер.
  • Источником является PixelShader1.hlsl.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Параметры отладки включают дополнительные параметры для отключения оптимизации компилятора (Od) и включения отладочной информации (Zi), например номеров строк и символов.

Полный список параметров командной строки см. на странице Синтаксис .

Компиляция с помощью устаревшего компилятора

Начиная с Direct3D 10 некоторые модели шейдеров больше не поддерживаются. К ним относятся модели пиксельных шейдеров: ps_1_1, ps_1_2, ps_1_3 и ps_1_4 которые поддерживают очень ограниченные ресурсы и зависят от оборудования. Компилятор был переработан с моделью шейдера 2 (или более поздней), что позволяет повысить эффективность компиляции. Для этого, конечно, потребуется, чтобы вы работали на оборудовании, поддерживающем модели шейдеров 2 и более поздней версии.

Кроме того, обратите внимание, что ознакомьтесь с заметками о выпуске пакета SDK, связанными с вашей версией компилятора FXC, о поведении, на которое влияет параметр /Gec.

Использование средства компилятора эффектов в подпроцессе

Если fxc.exe создается приложением в качестве подпроцесса, важно убедиться, что приложение проверяет и считывает все данные в выходных данных или конвейерах ошибок, передаваемых в функцию CreateProcess. Если приложение только ожидает завершения подпроцесса и один из каналов станет полным, подпроцесс никогда не завершится.

В следующем примере кода показано ожидание подпроцесса и чтение выходных данных и каналов ошибок, присоединенных к подпроцессу. Содержимое массива WaitHandles соответствует дескрипторам для подпроцесса, каналу для stdout и каналу для 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;
}

Дополнительные сведения о порождении процесса см. на странице справочника по CreateProcess.