Paramètres shader génériques [XNA, HLSL][Résolu] - C#/.NET managed - Programmation
Marsh Posté le 20-11-2009 à 02:10:56
Alors, salut et merci pour ta réponse.
Ce que je cherche a faire, c'est une implémentation propre.
Effectivement mon fichier XML contiendra de toute façon, une pair clef - valeur agrémentée d'un type.
Exemple :
Code :
|
J'ai donc bien une pair clef - valeur.
La clef est "WaterColor" qui correspond au nom de la variable HLSL.
La valeur est contenu dans un Vector4.
Le problème c'est que pour avoir ce type de structure dans le XML il faut que j'ai le type de code que j'ai posté dans mon 1er message pour le recevoir, il faut bien que j'ai en dur dans mon code un
Code :
|
Je suis oblige d'avoir ca pour chacun des types et je trouve simplement ca moche.
L'ideal serait un truc du genre :
Code :
|
Le probleme c'est que je ne peux pas passer a SetValue() directement un type object, il faut le caster.
Et pour le caster je dois tester le type..
Code :
|
Je trouve ca encore plus moche que parcourir chacun des dictionnaires de type.
Voila, donc le probleme n'est pas vraiment "Comment le faire fonctionner", mais comment le rendre réellement générique, car pour moi tout ca reste encore plus ou moins en dur.
Marsh Posté le 20-11-2009 à 18:35:59
C'est un type Effect, maintenant je connais que cette façon d'assigner un paramètre HLSL, si il y a un moyen plus générique je suis curieux de le connaitre.
C'était bien sur pour l'exemple, j'ai codé ca sur le forum pendant la rédaction du message, l'idée ici était de présenter le problème pas d'optimiser
Il est défini juste au dessus dans mon précédent message :
Code :
|
Bah je sais pas quoi te dire..
Je vais avoir en entrée un XML chargé de décrire un matériau, ce matériau utilisera un fichier .fx qui demandera des variables à assigner dans le code XNA.
Le but était d'éviter de faire 50 000 dictionnaire comme je l'ai présenté dans mon 1er message, et d'éviter de faire un switch avec des "is" de 100 lignes pour tester chaque type.
Maintenant si c'est trop complexe ca en devient inutile, simplement si une solution simple existe j'aurai aimé la connaitre.
Marsh Posté le 20-11-2009 à 21:37:16
Hum, le XML je le déserialise qu'on soit bien d'accord, j'aurais peut-être du etre plus clair la dessus dès le début.
Donc vu que je le déserialise je suis obligé d'avoir la représentation de la structure du XML en code C# pour reconstruire un objet.
D'ou mes listes pour chaque type.
Un exemple du genre de XML que j'utilise :
Code :
|
Chaque <Item> du 1er <Dictionary> décrit un matériau.
Ensuite à l'intérieur les variables sont classées par type, un dico par type.
La classe material est donc de la forme suivante :
Code :
|
C'est un extrait des champs qu'utilise chaque matériaux.
A savoir que si 20 objets utilise le même matériau, ils utilisent la même instance, sinon bonjour la mémoire.
Marsh Posté le 20-11-2009 à 23:32:07
Non ces listes sont uniquement décrites dans la classe Material, pas besoin d'héritage ici.
Ce n'est vraiment un problème comme je pensais l'avoir expliqué, c'est simplement que j'étais "choqué" d'avoir à créer toutes ces listes et je pensais passer a coté d'une fonctionnalité du C# en étant obligé de faire comme ca.
Maintenant si aucune autre manière n'existe pas de problème je garde mes dicos, ca marchera
Marsh Posté le 21-11-2009 à 00:25:12
^^, je vais en rester là dans ce cas.
Merci beaucoup pour ton aide et pour le temps passé à me répondre
Marsh Posté le 21-11-2009 à 11:36:33
Oui et il faut le faire pour chacun des dico ^^, mais bon ca a la mérite de fonctionner c'est déjà bien
Marsh Posté le 20-01-2010 à 13:32:21
Dans XNA 3.0, il y a un Content Importer spécifique qui fait pile poil ce que tu cherches. Voir http://www.gulix.fr/blog/spip.php?article142
Marsh Posté le 19-11-2009 à 22:42:27
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) :
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 :
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