Compiler un effet (Direct3D 10)
Une fois qu’un effet a été créé, la première étape consiste à compiler le code pour vérifier 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 dans un effet ressemble beaucoup au code HLSL (il existe quelques exceptions qui seront gérées ultérieurement). De cette façon, le compilateur d’effet/hlsl (fxc.exe) se trouve dans le kit SDK dans le dossier utilitaires afin que vous puissiez 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.
- inclut
- macros
- indicateurs de nuanceur HLSL
- indicateurs FX
- vérification des erreurs
- rubriques connexes
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 );
Comprend
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 include personnalisé, dérivez une classe de l’interface Include. Cela fournit deux méthodes de classe : Ouvrir et Fermer. Implémentez le comportement personnalisé dans les méthodes Open et Close.
Macros
La compilation d’effet 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 un. Le code d’effet qui utilise les deux macros est illustré ici.
if( bAnimate )
vAnimatedPos += float4(vNormal, zero) *
(sin(g_fTime+5.5)+0.5)*5;
Output.Diffuse.a = one;
Voici la déclaration des deux macros.
D3D_SHADER_MACRO Shader_Macros[3] = { "zero", "0", "one", "1.0f", NULL, NULL };
Les macros sont un tableau de macros arrêté 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 affectent 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 : y compris les informations de débogage, empêchant le contrôle de flux.
- Considérations matérielles : la cible de compilation et indique si un nuanceur peut 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 conflictuelles. Pour obtenir la liste des indicateurs, consultez constantes d’effet (Direct3D 10).
Indicateurs FX
Ces indicateurs utilisés lors de la création d’un effet pour définir le comportement de compilation ou le comportement d’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. Toutefois, il n’est pas lisible directement en retournant un pointeur vers la mémoire tampon qui contient les données (qui est une chaîne), vous pouvez voir toutes 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 espion dans Microsoft Visual Studio.
capture d’écran
Étant donné que l’erreur est retournée dans un pointeur LPVOID, convertissez-la en chaîne de caractères dans la fenêtre espionne.
Voici le code utilisé pour renvoyer 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
}
Rubriques connexes