Bonjour,
Je me retrouve une nouvelle fois devant un problème que je n'arrive pas a résoudre proprement.
Dans la réalisation de mon petit moteur 3D j'aimerai gérer une quantité n de matériaux différents.
Chaque matériau doit être facilement applicable à un modèle et décrit à l'aide d'un fichier .xml et d'un fichier .fx.
Le soucis est que dans cette optique, je ne connais ni le type, ni le nombre de variables qui seront à transmettre à la carte graphique, hormis les classiques matrices monde, vue, projection et les paramètres d'éclairage.
Par exemple, dans le cas d'un shader d'eau, j'ai un bon nombre de variable à passer :
- 2 textures : les maps de reflection et refraction.
- Plusieurs vecteurs : direction du vent, hauteur des vagues & co.
- des floats : comme par exemple le temps écoulé depuis la dernière frame.
Tout ces paramètres sont simple à passer en dur, mais j'aimerai ne pas m'amuser a faire une classe par matériau, l'idée de les ajouter via l'éditeur, au clic.
Donc au risque de me répéter, il faudrait que tout ces paramètres soit entièrement décrit dans un fichier de matériaux (un .xml dans mon cas).
Voici la ligne permettant d'ajouter un paramètre de façon classique (ici la couleur de l'eau) :
Code :
- this.effect.Parameters["xWaterColor"].SetValue(this.waterColor);
|
Le soucis est que SetValue() n'aime pas du tout les types génériques, elle possède une surcharge pour chaque type supporté.
J'ai donc pensé à une solution que je trouve TRÈS moche que voici :
Code :
- private SerializableDictionary<string, float> floatList = new SerializableDictionary<string, float>();
- private SerializableDictionary<string, int> intList = new SerializableDictionary<string, int>();
- private SerializableDictionary<string, Vector2> vector2List = new SerializableDictionary<string, Vector2>();
- [...]
|
Pour chaque type de paramètres supporté, j'ai un dictionnaire décrit dans le XML.
La clef du dictionnaire correspond au nom de la variable dans code HLSL, et la valeur, la valeur à passer.
D'une c'est moche, et absolument pas souple, ici pas de support de variables changeant au runtime (comme par exemple le temps), ce ne sont que des valeurs statiques et décrites de façon très lourde.
Voila j'espère ne pas avoir faire trop long, si l'un de vous à une solution plus souple et rapide je lui en serai fortement reconnaissant !
Merci
Message édité par Stnaire le 21-11-2009 à 00:28:19