Compilation de nuanceurs

Notes

Cette rubrique décrit le compilateur utilisé pour les FXC.EXE modèles de nuanceur 2 à 5.1. Pour le modèle de nuanceur 6, vous utilisez DXC.EXE à la place, ce qui est documenté dans Using dxc.exe et dxcompiler.dll. Visual Studio utilise DXC.EXE automatiquement quand le modèle de nuanceur 6 est sélectionné pour la configuration de la page de propriétés HLSL.

Microsoft Visual Studio peut compiler du code de nuanceur à partir des fichiers *.hlsl et *.fx que vous incluez dans votre projet C++.

Dans le cadre du processus de génération, Visual Studio utilise le compilateur de code HLSLfxc.exe ou dxc.exe pour compiler les fichiers sources du nuanceur HLSL dans des fichiers objet de nuanceur binaire ou dans des tableaux d’octets définis dans les fichiers d’en-tête. La façon dont le compilateur de code HLSL compile chaque fichier source du nuanceur dans votre projet dépend de la façon dont vous spécifiez la propriété Fichiers Ouput pour ce fichier. Pour plus d’informations sur les pages de propriétés HLSL, consultez Pages de propriétés HLSL.

La méthode de compilation que vous utilisez dépend généralement de la taille de votre fichier source du nuanceur HLSL. Si vous incluez une grande quantité de code d’octet dans un en-tête, vous augmentez la taille et le temps de chargement initial de votre application. Vous forcez également tout le code d’octet à résider dans la mémoire même après la création du nuanceur, ce qui gaspille des ressources. Toutefois, lorsque vous incluez du code d’octet dans un en-tête, vous pouvez réduire la complexité du code et simplifier la création du nuanceur.

Examinons maintenant différentes façons de compiler votre code de nuanceur et les conventions pour les extensions de fichiers pour le code de nuanceur.

Utilisation des extensions de fichier de code du nuanceur

Pour vous conformer à la convention Microsoft, utilisez ces extensions de fichier pour votre code de nuanceur :

  • Un fichier avec l’extension .hlsl contient le code source HLSL (High Level Shading Language). L’ancienne extension .fx est également prise en charge, mais est généralement associée au système d’effets hérité.
  • Un fichier avec l’extension .cso contient un objet de nuanceur compilé.
  • Un fichier avec l’extension .h est un fichier d’en-tête, mais dans un contexte de code de nuanceur, ce fichier d’en-tête définit un tableau d’octets qui contient des données de nuanceur. D’autres extensions courantes pour les en-têtes de code de nuanceur HLSL incluent .hlsli et .fxh.

Compilation au moment de la génération dans des fichiers objet

Si vous compilez vos fichiers .hlsl dans des fichiers d’objets de nuanceur binaires, votre application doit lire les données de ces fichiers d’objets (.cso est l’extension par défaut de ces fichiers objet), affecter les données à des tableaux d’octets et créer des objets de nuanceur à partir de ces tableaux d’octets. Par exemple, pour créer un nuanceur de vertex (ID3D11VertexShader**), appelez la méthode ID3D11Device::CreateVertexShader avec un tableau d’octets qui contient le code d’octet compilé du nuanceur de vertex. Dans cet exemple de code, la propriété Fichiers Ouput pour le fichier SimpleVertexShader.hlsl spécifie de compiler dans le fichier objet SimpleVertexShader.cso.

        auto vertexShaderBytecode = ReadData("SimpleVertexShader.cso");
        ComPtr<ID3D11VertexShader> vertexShader;
        DX::ThrowIfFailed(
            m_d3dDevice->CreateVertexShader(
                vertexShaderBytecode->Data,
                vertexShaderBytecode->Length,
                nullptr,
                &vertexShader
                )

L’aide ReadData ici recherche dans le répertoire de travail actuel, ainsi que dans le même répertoire que le fichier EXE du processus actuel, car les fichiers .cso sont généralement trouvés avec d’autres produits de build VS. Consultez ReadData.h pour obtenir un exemple d’implémentation.

Compilation au moment de la génération dans des fichiers d’en-tête

Si vous compilez vos fichiers .hlsl dans des tableaux d’octets définis dans les fichiers d’en-tête, vous devez inclure ces fichiers d’en-tête dans votre code. Dans cet exemple de code, la propriété Fichiers Ouput pour le fichier PixelShader.hlsl spécifie de compiler dans le tableau d’octets g_psshader défini dans le fichier d’en-tête PixelShader.h.

namespace
{
       include "PixelShader.h"
}
...
        ComPtr<ID3D11PixelShader> m_pPixelShader;
        hr = pDevice->CreatePixelShader(g_psshader, sizeof(g_psshader), nullptr, &m_pPixelShader);

Compilation avec D3DCompileFromFile

Vous pouvez également utiliser la fonction D3DCompileFromFile au moment de l’exécution pour compiler le code de nuanceur pour Direct3D 11. Pour plus d’informations sur la procédure à suivre, consultez Guide pratique pour compiler un nuanceur.

Notes

Les applications du Windows Store prennent en charge l’utilisation de D3DCompileFromFile pour le développement, mais pas pour le déploiement.

 

Guide de programmation pour HLSL

Guide de programmation pour HLSL