Partager via


Compiler un effet (Direct3D 10)

Une fois qu’un effet a été créé, la première étape consiste à compiler le code pour case activée pour les problèmes de syntaxe. Pour ce faire, appelez l’une des API de compilation (comme D3DX10CompileEffectFromFile, D3DX10CompileEffectFromResource, D3DX10CompileEffectFromMemory). Ces API appellent le compilateur d’effet fxc.exe qui est le compilateur utilisé pour compiler le code HLSL. C’est pourquoi la syntaxe du code d’un effet ressemble beaucoup au code HLSL (il existe quelques exceptions qui seront gérées ultérieurement). Soit dit en passant, le compilateur d’effet/compilateur hlsl (fxc.exe) se trouve dans le Kit de développement logiciel (SDK) dans le dossier utilitaires, ce qui vous permet de compiler vos nuanceurs (ou effets) hors connexion si vous le souhaitez. Consultez la documentation relative à l’exécution du compilateur à partir de la ligne de commande.

Voici un exemple de compilation d’un fichier d’effet (à partir de l’exemple BasicHLSL10).

WCHAR str[MAX_PATH];
DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );

hr = D3DX10CompileEffectFromFile( str, NULL, NULL, "fx_4_0", 
    D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL, 
    &l_pBlob_Effect, &l_pBlob_Errors, NULL );

Includes

Un paramètre est une interface include. Générez l’un de ces éléments si vous souhaitez inclure un comportement personnalisé lors de la lecture d’un fichier include. Ce comportement personnalisé est exécuté chaque fois qu’un effet (qui utilise le pointeur include) est créé ou lorsqu’un effet (qui utilise le pointeur include) est compilé. Pour implémenter un comportement d’include personnalisé, dérivez une classe de l’interface Include. Cela fournit vos méthodes de classe 2 : Ouvrir et Fermer. Implémentez le comportement personnalisé dans les méthodes Open et Close.

Macros

La compilation d’effets peut également prendre un pointeur vers des macros définies ailleurs. Par exemple, supposons que vous deviez modifier l’effet dans BasicHLSL10 pour utiliser deux macros : zéro et une. Le code d’effet qui utilise les deux macros s’affiche ici.

if( bAnimate )
    vAnimatedPos += float4(vNormal, zero) *  
        (sin(g_fTime+5.5)+0.5)*5;
        
    Output.Diffuse.a = one;         

Voici la déclaration pour les deux macros.

D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };

Les macros sont un tableau de macros terminé par null ; où chaque macro est définie avec un struct D3D_SHADER_MACRO .

Enfin, modifiez l’appel d’effet de compilation pour prendre un pointeur vers les macros.

D3DX10CreateEffectFromFile( str, Shader_Macros, NULL, 
    D3D10_SHADER_ENABLE_STRICTNESS, 0, pd3dDevice, NULL, NULL, 
    &g_pEffect10, NULL );

Indicateurs de nuanceur HLSL

Les indicateurs de nuanceur spécifient des contraintes de nuanceur pour le compilateur HLSL. Ces indicateurs ont un impact sur le code généré par le compilateur du nuanceur, notamment :

  • Considérations relatives à la taille : optimiser le code.
  • Considérations relatives au débogage : notamment les informations de débogage, la prévention du contrôle de flux.
  • Considérations matérielles : la cible de compilation et si un nuanceur peut ou non s’exécuter sur du matériel hérité.

En général, ces indicateurs peuvent être combinés logiquement, en supposant que vous n’avez pas spécifié deux caractéristiques en conflit. Pour obtenir la liste des indicateurs, consultez Constantes d’effet (Direct3D 10).

Indicateurs FX

Ces indicateurs sont utilisés lors de la création d’un effet pour définir le comportement de compilation ou le comportement de l’effet d’exécution. Pour obtenir la liste des indicateurs, consultez Constantes d’effet (Direct3D 10).

Vérification des erreurs

Si pendant la compilation, une erreur se produit, l’API retourne une interface qui contient les erreurs retournées par le compilateur d’effet. Cette interface est appelée ID3D10Blob. Il n’est pas directement lisible, cependant, en retournant un pointeur vers la mémoire tampon qui contient les données (qui est une chaîne), vous pouvez voir les erreurs de compilation.

Dans cet exemple, une erreur a été introduite dans l’effet BasicHLSL.fx en copiant deux fois la première déclaration de variable.

//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
float4 g_MaterialAmbientColor;      // Material's ambient color

// Declare the same variable twice
float4 g_MaterialAmbientColor;      // Material's ambient color

Cette erreur a provoqué le retour de l’erreur suivante par le compilateur, comme illustré dans la capture d’écran suivante de la fenêtre watch dans Microsoft Visual Studio.

capture d’écran de la fenêtre watch visual studio

Étant donné que l’erreur est retournée dans un pointeur LPVOID, castez-la en chaîne de caractères dans la fenêtre watch.

Voici le code utilisé pour retourner l’erreur de la compilation ayant échoué.

// Read the D3DX effect file
WCHAR str[MAX_PATH];
ID3D10Blob* l_pBlob_Effect = NULL;
ID3D10Blob* l_pBlob_Errors = NULL;
hr = DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"BasicHLSL10.fx" );
hr = D3DX10CompileEffectFromFile( str, NULL, NULL, 
    D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, 
    &l_pBlob_Effect, &l_pBlob_Errors );

LPVOID l_pError = NULL;
if( l_pBlob_Errors )
{
    l_pError = l_pBlob_Errors->GetBufferPointer();
    // then cast to a char* to see it in the locals window
}

Rendu d’un effet (Direct3D 10)