Sdílet prostřednictvím


Offline kompilace

Nástroj kompilátoru efektu (fxc.exe) je určen pro offline kompilaci shaderů HLSL.

Kompilace s aktuálním kompilátorem

Modely shaderů podporované aktuálním kompilátorem se zobrazují v Profilech. Tento příklad zkompiluje pixelový shader pro shader model 5.1.

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

V tomto příkladu:

  • ps_5_1 je cílový profil.
  • PixelShader1.fxc je výstupní soubor objektu obsahující zkompilovaný shader.
  • PixelShader1.hlsl je zdroj.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Mezi možnosti ladění patří další možnosti, jak zakázat optimalizace kompilátoru (Od) a povolit ladicí informace (Zi), jako jsou čísla řádků a symboly.

Úplný seznam možností příkazového řádku najdete na stránce Syntaxe.

Kompilace pomocí starší verze kompilátoru

Od Direct3D 10 se některé modely shaderu už nepodporují. Patří sem modely pixelového shaderu: ps_1_1, ps_1_2, ps_1_3 a ps_1_4, které podporují velmi omezené prostředky a jsou závislé na konkrétním hardwaru. Kompilátor byl přepracovaný modelem shaderu 2 (nebo novějším), který umožňuje větší efektivitu kompilace. To samozřejmě bude vyžadovat, abyste běželi na hardwaru, který podporuje modely shaderu 2 a vyšší.

Mějte také na paměti, že byste se měli podívat na poznámky k verzi sady SDK přidružené k vaší verzi kompilátoru FXC, kde najdete chování ovlivněné přepínačem /Gec.

Použití nástroje kompilátoru efektu v podprocesu

Pokud je fxc.exe vytvořen jako podproces aplikací, je důležité zajistit, aby aplikace kontrolovala a četla veškerá data ve výstupních nebo chybových kanálech předaných funkci CreateProcess. Pokud aplikace čeká pouze na dokončení podprocesu a jeden z kanálů se zaplní, podproces se nikdy nedokončí.

Následující příklad kódu znázorňuje čekání na podproces a čtení výstupních a chybových kanálů připojených k podprocesu. Obsah pole WaitHandles odpovídá popisovačům pro podproces, potrubí pro stdout a potrubí pro 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;
}

Další informace o spouštění procesu naleznete na referenční stránce pro CreateProcess.