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

DirectX Discussion :

Constant buffer et matrices de transformations


Sujet :

DirectX

  1. #1
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut Constant buffer et matrices de transformations
    Bien le bonjour,

    Dans DirectX 11 on peut utiliser un constant buffer pour envoyer les matrices de transformation à un shader.

    J'organise ma scène sous forme d'un graphe de scène avec notamment des nœuds pour dessiner des meshes. Pour le rendu via un shader je dois passer la matrice monde de mon objet, ainsi que les matrices de vue et de projection de la caméra à mon shader via un constant buffer.

    Donc voici comment j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    struct TransformCBuffer
    {
    	XMMATRIX World;
    	XMMATRIX View;
    	XMMATRIX Projection;
    };
     
    ...
     
    //------------------------------------------------------------------
    void MeshSceneNode::render(void)
    {
    	Renderer::TransformCBuffer cBuffer;
    	cBuffer.World = XMMatrixTranspose( mWorldMatrix );
    	cBuffer.View = XMMatrixTranspose( mpSceneGraph->getCamera()->getViewMatrix() );
    	cBuffer.Projection = XMMatrixTranspose( mpSceneGraph->getCamera()->getProjectionMatrix() );
     
    	mpSceneGraph->getRenderer()->updateTransformCBuffer( cBuffer );
    	mpMeshRenderer->renderMesh();
    }
    Voyez vous une meilleure façon de mettre à jour mon constant buffer avec la matrice monde de mon noeud. Quand je dit une meilleur façon je ne parle pas de l'utilisation d'un constant buffer mais plutôt d'une méthode autre que de le faire dans le nœud de scène directement.

    Kromagg

  2. #2
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Meilleur de quel point de vue? S'il s'agit de temps d'exécution, c'est vrai qu'en théorie, une décomposition d'appels à Render basée sur une décomposition en arbres de scène peut difficilement être optimale en termes de performance, car il n'y a pas de raison que la décomposition de la scène soit calquée correctement sur les changements d'état idéaux du GPU. En pratique, je pense qu'il faut tester, selon l'équilibre de vos tâches et la granularité de vos meshes, les quelques changements des valeurs de votre CB pourraient causer des hoquets, quoi que j'en doute si on parle de graphes de scènes classiques (squelettes, ...).

    Si on parle de conception, le fait même d'attacher une fonction membre Render à un Mesh me parait très sain malgré la réserve ci-dessus. Par contre, pourquoi vouloir redéfinir les matrices à chaque Mesh alors qu'il semble que vous accédez simplement à des matrices globales? Changent-elles d'un Mesh à l'autre? Si non, un CB n'est pas changé par des appels à draw, donc pas besoin de rafraichir ces valeurs.

    Il me semble que MeshSceneNode::render serait l'endroit idéal pour modifier ces matrices globales constantes par des matrices locales au Mesh, par exemple des rotations/déplacements... Se poserait alors l'alternative de le faire dans le shader à l'aide de membres supplémentaires dans votre définition de Vertex, ou bien dans la partie C++ comme vous le faites ici. Mais votre code de Render local au Mesh ne semble pas faire appel à des matrices locales au Mesh.

  3. #3
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut
    Citation Envoyé par ac_wingless Voir le message
    Meilleur de quel point de vue?
    Je parlais plus d'un point de vue conceptuel, pour le moment je ne suis pas encore assez calé sur DirectX 11 et toutes les notions liées à la 3D pour me soucier des performances. Je code d'abord d'une façon qui me semble la plus propre possible, ensuite j'essaierai d'optimiser (et le cas échéant revoir l'architecture).
    J'étudie en ce moment un moteur 3D basé sur DirectX 11 (Hieroglyph3). Il a été écrit à l'occasion de la sortie du livre "Practical Rendering and Computation with DirectX 11". Les développeurs ont reproduit le pipeline DirectX sous forme de classes (parties fixe et parties programmable) avec une master classe PipelineManager et ParameterManager qui permettent de définir les états généraux du pipeline et les états/paramètres spécifiques pour le rendu d'un mesh (par exemple).

    Citation Envoyé par ac_wingless Voir le message
    Si on parle de conception, le fait même d'attacher une fonction membre Render à un Mesh me parait très sain malgré la réserve ci-dessus. Par contre, pourquoi vouloir redéfinir les matrices à chaque Mesh alors qu'il semble que vous accédez simplement à des matrices globales? Changent-elles d'un Mesh à l'autre? Si non, un CB n'est pas changé par des appels à draw, donc pas besoin de rafraichir ces valeurs.
    En effet vous avez raison il faudrait simplement que je mette à jour la matrice globale de mon Mesh. Je viens d'ailleurs de lire dans la documentation DirectX 11 que le meilleur moyen d'utiliser les constant buffers et d'organiser les variables de shader dans des constant buffers en fonction de leur fréquence de mise à jour. Ça permet ainsi de diminuer l'utilisation de la bande passante pour mettre à jour les constantes de shader. Il faudrait donc un constant buffer qui stocke les matrices de vue et projection et un constant buffer qui stocke la matrice monde de mon Mesh.

    Citation Envoyé par ac_wingless Voir le message
    Il me semble que MeshSceneNode::render serait l'endroit idéal pour modifier ces matrices globales constantes par des matrices locales au Mesh, par exemple des rotations/déplacements... Se poserait alors l'alternative de le faire dans le shader à l'aide de membres supplémentaires dans votre définition de Vertex, ou bien dans la partie C++ comme vous le faites ici. Mais votre code de Render local au Mesh ne semble pas faire appel à des matrices locales au Mesh.
    Je n'ai pas très bien compris votre raisonnement. Je met à jour la matrice globale de mon noeud de scène à chaque update que j’envoie ensuite à mon shader.

    Kromagg

Discussions similaires

  1. [Java2D] Matrice de transformation
    Par Talstus dans le forum 2D
    Réponses: 13
    Dernier message: 13/04/2007, 00h30
  2. Réponses: 4
    Dernier message: 08/03/2007, 10h32
  3. Ajouter une matrice de transformation
    Par Ekinoks dans le forum OpenGL
    Réponses: 9
    Dernier message: 20/11/2006, 19h32
  4. Envoyer la matrice de transformation
    Par Ekinoks dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/11/2006, 10h10
  5. Moteur 2D: Pb de calcul de Matrice de transformation
    Par themadmax dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 29/06/2006, 11h22

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