Offlinekompilierung

Das Effektcompilertool (fxc.exe) ist für die Offlinekompilierung von HLSL-Shadern konzipiert.

Kompilieren mit dem aktuellen Compiler

Die vom aktuellen Compiler unterstützten Shadermodelle werden unter Profile angezeigt. In diesem Beispiel wird ein Pixelshader für das Ziel des Shadermodells 5.1 kompiliert.

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

In diesem Beispiel:

  • ps_5_1 ist das Zielprofil.
  • PixelShader1.fxc ist die Ausgabeobjektdatei, die den kompilierten Shader enthält.
  • PixelShader1.hlsl ist die Quelle.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Die Debugoptionen umfassen zusätzliche Optionen zum Deaktivieren von Compileroptimierungen (Od) und zum Aktivieren von Debuginformationen (Zi) wie Zeilennummern und Symbolen.

Eine vollständige Liste der Befehlszeilenoptionen finden Sie auf der Seite Syntax .

Kompilieren mit dem Legacycompiler

Ab Direct3D 10 werden einige Shadermodelle nicht mehr unterstützt. Dazu gehören Pixelshadermodelle: ps_1_1, ps_1_2, ps_1_3 und ps_1_4 die sehr begrenzte Ressourcen unterstützen und von Hardware abhängig sind. Der Compiler wurde mit Shadermodell 2 (oder höher) neu gestaltet, was eine höhere Effizienz bei der Kompilierung ermöglicht. Dies erfordert natürlich, dass Sie auf Hardware ausführen, die Shadermodelle 2 und höher unterstützt.

Beachten Sie auch, dass Sie die SDK-Versionshinweise lesen sollten, die Ihrer Version des FXC-Compilers zugeordnet sind, um das Verhalten zu ermitteln, das von der /Gec-Option betroffen ist.

Verwenden des Effektcompilertools in einem Unterprozess

Wenn fxc.exe von einer Anwendung als Unterprozess erstellt wird, ist es wichtig, sicherzustellen, dass die Anwendung daten in Ausgabe- oder Fehlerpipes, die an die CreateProcess-Funktion übergeben wurden, überprüft und liest. Wenn die Anwendung nur darauf wartet, dass der Unterprozess abgeschlossen ist und eine der Pipes voll wird, wird der Teilprozess nie abgeschlossen.

Der folgende Beispielcode veranschaulicht das Warten auf einen Unterprozess und das Lesen der an den Unterprozess angefügten Ausgabe- und Fehlerpipes. Der Inhalt des WaitHandles Arrays entspricht Handles für den Unterprozess, der Pipe für stdout und der Pipe für 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;
}

Weitere Informationen zum Erstellen eines Prozesses finden Sie auf der Referenzseite für CreateProcess.