IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Implémentation d'un ShaderLoader


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Implémentation d'un ShaderLoader
    Bonjour

    Je suis en train de lire les articles sur la création d'un moteur 3D présent sur le site, et je m'appuie beaucoup sur l'architecture proposée.
    J'en suis à la réalisation de loader, mais j'ai un petit soucis.

    Je souhaite réaliser les loaders de:
    -> fichier obj (OBJLoader)
    -> fichier shader (ShaderLoader)

    Jusque là, pas de soucis.
    Cependant, je ne vois pas vraiment l'interet que ça peut avoir dans le cas du ShaderLoader.

    Pour mon OBJLoader je procède comme ceci:
    Je crée un objet de type Mesh avec un new. Ensuite je crée un objet MeshFrame pour chaque "frame" (bon, pour l'Obj il y en a qu'une) puis une fois le MeshFrame créé je fais: monMesh->addFrame(meshFrame);
    Est-ce une bonne façon de faire ou c'est totalement stupide ?

    Maintenant, j'ai voulu appliquer ce principe à mon Shader.
    (la distinction VertexShader et FragmentShader se fait dans le constructeur, suivant l'extension du fichier).
    Avant, ce que je faisais, c'est que dans le constructeur de mon Shader, j'appellais les fonctions de chargement qui étaient interne à la classe. Cependant, ici ça serait stupide de le faire, surtout si j'ai un ShaderLoader.
    Ce que j'ai pensé à faire donc, dans le ShaderLoader: charger le fichier, le compiler, créer un Shader (avec new), charger le code source du Shader etl le compiler, et enfin appeller: monShader->setID(idShader);

    Ici je me pose la question, est-ce une bonne idée de faire comme ça ? C'est pas un peu étrange ?

    Sinon j'aimerai savoir si vous aviez des articles sur l'architecture de moteur 3D, juste pour voir ce qu'il se fait d'autre.

    Merci d'avance, et désolé si ma question est stupide .. ^^'

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    L'idée est définitivement pas stupide, mais j'entrevois quelques mauvais choix pour la réalisation.

    1) ces objets sont des factory: un OBJLoader créer un objet de type mesh, tandis qu'un ShaderLoader crée un shader. Une fois l'ensemble du travail effectué, la création de l'objet cible doit se faire avec un appel unique du constructeur (pas de setter, puisque le setter public serait accessible à une autre partie du programme). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class vertex_shader_loader
    {
    public:
      shader* build_shader()
      {
        load_shader();
        compile_shader();
        return new shader(informations nécessaire à la création de l'instance shader)
      }
    };
    2) il est en outre préférable de n'avoir à gérer qu'un seul format de fichier par loader - donc prévoir un VShaderLoader et un PShaderLoader (qui peuvent hériter de la même classe, de manière à partager leur interface). Une classe factory peut permettre de créer l'instance souhaitée en fonction de paramètres spécifiques (ici: l'extension du fichier). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class shader_loader_factory
    {
     
    public:
      shader_loader* get_loader(std::string filename)
      {
         std::string ext = get_extension(filename);
         if (ext == "psh") return new pixel_shader_loader(filename);
         if (ext == "vsh") return new vertex_shader_loader(filename);
         throw std::exception("invalid shader file extension");
      }
    };
    On peut bien sûr avoir quelque chose de mieux penser de manière à pouvoir ajouter ou retirer des loader sans pour autant avoir à modifier cette classe.

    La même technique peut être employée pour la création de mesh, de manière à gérer plusieurs formats.

    --
    Internet contient (relativement) peu d'articles sur l'architecture des moteurs 3D. Tout au plus, on va trouver quelques informations ici et là sur certaines composantes particulières, mais les explications complètes sont rares. Au niveau des livres c'est une autre histoire: on retrouve bien évidemment les livres de Dave Eberly, ainsi que toute une flopée de livre plus ou moins bien pensés (par exemple "Software Engineering and Computer Games" de Rudy Rucker; le livre m'a déçu, notamment dans son traitement de ce qu'est l'architecture objet; mais bon, c'est un détail...).

    On peut quand même rechercher parmi les moteurs 3D existant pour voir ce qui se fait. La base de donnée de moteurs de devmaster.net est à ce titre une bonne source d'information.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/07/2004, 11h03
  2. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  3. Moteur physique : comment l'implémenter ?
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 17/12/2003, 12h56
  4. Réponses: 2
    Dernier message: 06/07/2002, 12h36
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo