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

Moteurs 3D Discussion :

Stockage de la géométrie


Sujet :

Moteurs 3D

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué 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 : 37
    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
    Points : 198
    Points
    198
    Par défaut Stockage de la géométrie
    Bonjour

    Petite question concernant le stockage de la géométrie dans une classe Mesh.
    J'ai vu différentes façon de faire. Certains moteur de rendu stockent les informations liées aux sommets (position, couleur, normale...) ainsi que les indices dans une classe Mesh via des conteneurs (std::vector) du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Mesh
    {
    public:
        Mesh();
        ~Mesh();
        ...
    private:
        std::vector<Vertex> m_vVertices;
        std::vector<int> m_vIndices;
    };
    Et d'autres vont plutôt stocker directement des buffers du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Mesh
    {
    public:
        Mesh();
        ~Mesh();
        ...
    private:
        VertxBuffer* m_pVertexBuffer;
        IndexBuffer* m_pIndexBuffer;
    };
    Quelles différences cela fait-il exactement ?

    Kromagg

  2. #2
    screetch
    Invité(e)
    Par défaut
    Ben ca depend de la classe VertexBuffer. En theorie c'est peut etre seulement une classe similaire a vector.

    mais je pense que c'est une classe qui encapsule des donnees GPU et la difference est donc que les donnees du mesh seraient stockees sur la memoire du GPU au lieu de la memoire du CPU.

  3. #3
    Membre habitué 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 : 37
    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
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par screetch Voir le message
    Ben ca depend de la classe VertexBuffer. En theorie c'est peut etre seulement une classe similaire a vector.

    mais je pense que c'est une classe qui encapsule des donnees GPU et la difference est donc que les donnees du mesh seraient stockees sur la memoire du GPU au lieu de la memoire du CPU.
    Dans cet exemple il s'agit bien de données stockés côté GPU (VBO OpenGL par exemple). Quelle différence cela fait-il de stocker les données du mesh directement en mémoire GPU au lieu de la mémoire CPU ? Est-ce que c'est plus optimisé pour les transferts CPU/GPU ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 899
    Points : 219 808
    Points
    219 808
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Comme le dit screetch, on ne connait pas vraiment ce que fait la classe VertexBuffer.

    Sinon, si seulement les ID des buffers coté GPU sont gardés, cela posera une contrainte supplémentaire. En effet, il sera un peu plus dur de faire changer la mesh (que ce soit couleur, tex coord ou positions des points) facilement, si on ne garde pas toutes les données coté CPU. En effet, il n'est pas possible de lire les données du mesh stockés sur le GPU.

    Ce que je veux dire par là, c'est que l'on est presque tout le temps obligé de garder les données de la mesh coté CPU (sauf si la mesh est statique et que l'on sait que l'on ne la mettra pas à jour et donc, qu'elle restera inchangée coté GPU).

  5. #5
    Membre habitué 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 : 37
    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
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    En effet, il sera un peu plus dur de faire changer la mesh (que ce soit couleur, tex coord ou positions des points) facilement, si on ne garde pas toutes les données coté CPU. En effet, il n'est pas possible de lire les données du mesh stockés sur le GPU.
    Il me semblait pourtant que les fonctions comme glMapBuffer/glUnmapBuffer (avec flag GL_READ_ONLY) permettaient de récupérer le contenu de nos buffers et donc les données du mesh stockées sur le GPU.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 899
    Points : 219 808
    Points
    219 808
    Billets dans le blog
    125
    Par défaut
    Oui en effet, j'avais oublié car je n'ai pas l'habitude de le faire (et dire que je me demandais comment faisait gDEBugger ).

    Je pense que cela apporte quelques difficultés en plus, dans le sens, il faut savoir combien de données doivent être lues (donc la taille a du être conservée quelque part) et puis comme a pu le dire screetch, l'échange GPU <-> CPU a tendance à être lent, donc à éviter (éviter, dans le sens, en faire le moins possible).

  7. #7
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Kromagg Voir le message
    Est-ce que c'est plus optimisé pour les transferts CPU/GPU ?
    c'est plutot le contraire; ce qui est optimise c'est la rapidite de l'acces du GPU a ces donnees de vertex, donc c'est mieux pour le rendu
    en revanche, ces donnees etant sur le CPU, chaque fois que tu veux les changer (en gros) elles sont rapatriees sur la memoire du CPU avant d'etre modifiees puis renvoyees au GPU, autant dire que c'est long.

    en general il y a des mecanismes de double ou triple buffer qui sont ajoutes alors ce qui se passe precisement derriere l'interface VertexBuffer est tres difficile a comprendre.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 395
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 395
    Points : 20 499
    Points
    20 499
    Par défaut
    Citation Envoyé par Kromagg Voir le message

    Quelles différences cela fait-il exactement ?

    Kromagg
    Salut je conseillerais d'utiliser la solution avec des std::vector
    Si tu définis ceci
    VertxBuffer* m_pVertexBuffer;
    IndexBuffer* m_pIndexBuffer;
    1 tu est dépendant de l'API graphique...
    par exemple si tu utilises Direct3d comme l'API graphique change fréquemment tu seras obligé de réecrire du code.

    L'important c'est de faire des classes génériques de géométrie 3d.

    A ce moment-là il suffit d'appeler la méthode Dessine() ou Draw()d'une classe Video et là tu parcours les Indices et Vertices Buffer
    2-de toute façon à l'affichage dans le rendu des objets tu seras obligé constamment de verrouiller les VertexBuffer et IndexBuffer pour accéder à leur contenu et dessiner
    Parce que rien ne garantit que ces objets VB et IB aient une adresse mémoire constante,l'OS et la carte graphique peuvent très bien les déplacer en mémoire

  9. #9
    screetch
    Invité(e)
    Par défaut
    Pourquoi l'important c'est des classes generiques?
    a base de std::vector tu vas renvoyer des donnees a la carte graphique a chaque frame, ce qui est couteux mais aussi platform-specific qu'un VertexBuffer au final. Ca combine le plus lent et le moins portable...

  10. #10
    Membre habitué 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 : 37
    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
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par screetch Voir le message
    Pourquoi l'important c'est des classes generiques?
    a base de std::vector tu vas renvoyer des donnees a la carte graphique a chaque frame, ce qui est couteux mais aussi platform-specific qu'un VertexBuffer au final. Ca combine le plus lent et le moins portable...
    Quel est ton avis alors ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2004, 15h14
  2. Stockage de paramètres unitaires
    Par ovh dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 07/10/2003, 09h07
  3. [Kylix] stockage d'un tableau d'octets dans interbase
    Par georges1001 dans le forum EDI
    Réponses: 1
    Dernier message: 16/09/2003, 14h14
  4. gain stockage olap
    Par colomban dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/05/2003, 15h24
  5. [Stockage] Image dans un fichier XML
    Par ovh dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/04/2003, 16h21

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