Compilation hors connexion

L’outil de compilateur d’effets (fxc.exe) est conçu pour la compilation hors connexion des nuanceurs HLSL.

Compilation avec le compilateur actuel

Les modèles de nuanceur pris en charge par le compilateur actuel sont affichés dans Profils. Cet exemple compile un nuanceur de pixels pour la cible du modèle de nuanceur 5.1.

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

Dans cet exemple :

  • ps_5_1 est le profil cible.
  • PixelShader1.fxc est le fichier objet de sortie contenant le nuanceur compilé.
  • PixelShader1.hlsl est la source.
fxc /Od /Zi /T ps_5_1 /Fo PixelShader1.fxc PixelShader1.hlsl

Les options de débogage incluent des options supplémentaires pour désactiver les optimisations du compilateur (Od) et activer les informations de débogage (Zi) telles que les numéros de ligne et les symboles.

Pour obtenir une liste complète des options de ligne de commande, consultez la page Syntaxe .

Compilation avec le compilateur hérité

À compter de Direct3D 10, certains modèles de nuanceur ne sont plus pris en charge. Il s’agit notamment des modèles de nuanceur de pixels : ps_1_1, ps_1_2, ps_1_3 et ps_1_4 qui prennent en charge des ressources très limitées et dépendent du matériel. Le compilateur a été repensé avec le modèle de nuanceur 2 (ou supérieur), ce qui permet une plus grande efficacité avec la compilation. Bien sûr, cela nécessite que vous exécutiez sur du matériel qui prend en charge les modèles de nuanceur 2 et plus.

Notez également que vous devez consulter les notes de publication du Kit de développement logiciel (SDK) associées à votre version du compilateur FXC pour connaître le comportement affecté par le commutateur /Gec.

Utilisation de l’outil de compilateur d’effets dans un sous-processus

Si fxc.exe est généré en tant que sous-processus par une application, il est important de s’assurer que l’application vérifie et lit les données dans les canaux de sortie ou d’erreur passés à la fonction CreateProcess. Si l’application n’attend que la fin du sous-processus et que l’un des canaux est saturé, le sous-processus ne se termine jamais.

L’exemple de code suivant illustre l’attente sur un sous-processus et la lecture des canaux de sortie et d’erreur attachés au sous-processus. Le contenu du WaitHandles tableau correspond aux handles pour le sous-processus, au canal pour stdout et au canal pour 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;
}

Pour plus d’informations sur la génération d’un processus, consultez la page de référence de CreateProcess.