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

C++ Discussion :

Problème de rendu d'un Model 3DS avec V.B.O


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Points : 44
    Points
    44
    Par défaut Problème de rendu d'un Model 3DS avec V.B.O
    Bonjour,

    Je reviens encore vers vous car après avoir régler mes problèmes de V.B.O après la suite du tuto "moteur 3d c++" Yes::Engine, je rencontre un problème lorsque je souhaite afficher un Model 3D.

    Dans les sources du Tuto il y à déja un Loader MD2. J'ai donc voulu utiliser un autre Loader (3DS) pour essayer de bien assimiler les classes CBuffer etc...

    Comme on peut le voir si dessous j'ai deux résultat selon le changement d'une variable (préciser en dessous des images) :

    Nom : inde-ji.png
Affichages : 116
Taille : 40,1 KoNom : Sans titre.png
Affichages : 106
Taille : 7,1 Ko


    Lorsque je parcours tous les indices des face et que je l'est stock dans le buffer d'indices normalement cela m'affiche que la moitier du personnage alors que si j'utilise le même procéder que le loader MD2 cela m'affiche le personnage mes avec des troues

    voici le code de la boucle :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
            std::vector<C_Model::TVertex> Vertices;
    	std::vector<C_Model::TIndex>  Indices;
    	// Parcour tous les objets qui compose le model
    	for (int i = 0; i < pModel.numOfObjects; i++){
     
    		if (pModel.pObject.size() <= 0) break;
     
    		// récupère l'objet courant
    		t3DObject *pObject = &pModel.pObject[i];
     
    		// Parcours tous les vertices qui compose l'objet
    		for (int v = 0; v < pObject->numOfVerts; v++){
    			// Récupération des informations sur le sommet courant
    			C_Model::TVertex newVertex;
    			newVertex.Position = pObject->pVerts[v];
    			newVertex.Normal = *pObject->pNormals[v];
    			newVertex.Color = Renderer.ConvertColor(C_Color::White);
    			// ajoute le vertex au tableau de vertices
    			Vertices.push_back(newVertex);
    		}
     
    		// Parcour toutes les faces qui compose l'objet
    		for (int j = 0; j < pObject->numOfFaces; j++){
    			// parcour les vertices qui compose la face
    			for (int k = 0; k < 3; k++)
    			{
    				// récupère l'index du vertex
    				int index = pObject->pFaces[j].vertIndex[k];
    				// ajoute l'index au tableau d'indices
     
    				// Indices.push_back(j * 3 + 2 - k);  <----- si l'on met cette ligne = perso à moitier
    				Indices.push_back(index);  // <----- si l'on met cette ligne = perso avec des troues
    			}
    		}
    	}
    et voici les valeur exécuter par le V.B.O :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    //////////////////////////////
    // Buffer de vertices
    ///////////////////////////////
    glGenBuffers(1, &VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, 12902 * 28, NULL, GL_STATIC_DRAW);
     
    //////////////////////////////
    // Buffer d'indices
    ///////////////////////////////
    glGenBuffers(1, &IndexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 57174 * 28, NULL, GL_STATIC_DRAW);
     
     
    // vertices
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 28, BUFFER_OFFSET(0 + 0 * 28));
     
    //  normal
    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, 28, BUFFER_OFFSET(12 + 0 * 28));
     
    // couleurs
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 28, BUFFER_OFFSET(24 + 0 * 28));
     
    // Indices
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer->GetBuffer());
     
     
    // Rendu
    // le 5113 viens de GL_UNSIGNED_SHORT
    // unsigned long IndicesType = (m_IndexStride == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT);
    DrawElements(GL_TRIANGLES, 19058 * 3, 5113, 0); 
     
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    En total il y a :

    Indices = 57174
    Vertices = 12902

    Si quelqu'un aurait une piste d'ou peut venir le problème ou autre.

    J'espère que sa sera pas une erreur encore bête de ma part

    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je pense que c'est GL_TRIANGLES qui pose problème.

    garde la formule "avec les trous", et essaye avec un autre mode de lecture du buffer, tel que GL_STRIPS GL_TRIANGLE_STRIP (merci Bousk pour la correction)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ta version a trou est presque bonne, essaye avec GL_TRIANGLE_STRIP ou GL_TRIANGLE_FAN a la place de GL_TRIANGLES
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Moi il y a quand même les triangles qui relient les bras qui me gênent.
    N'est-ce pas dû au fait que tous les sous-objets du mesh se retrouvent dans le même VBO?
    Il est normalement possible de le faire, mais il faut malgré tout un draw call par sous objet (notamment pour donner le bon offset dans l'IBO, ou donner le bon IBO si on utilise un VBO avec plusieurs IBO).
    Je regarderais cette direction aussi, si j'étais toi.
    Tu peux commencer en ne chargeant qu'un sous objet dans ton VBO et en modifiant ton code afin qu'il soit rendu correctement.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre aide,

    désoler j'ai pas pu uploader les images cela ne fonctionnais.
    Les images avec juste le visage correspond au test avec un seul Objet.

    @leternel: Malheureusement cela ne marche pas en gardant la méthode à "troue" et GL_TRIANGLE_STRIP :




    @Bousk: Malheureusement même résultat avec GL_TRIANGLE_FAN :




    @dragonjoker59: En effet avec un seul Objet cela s'affiche correctement mais pas avec la méthode à "troue" avec l'autre:



    Pour le test j'ai directement mi l'objet que je souhaitais en dur mais je vais modifier mon code pour créer le même nombre de buffer que d'objets pour tester.

    Par contre je comprend pas vraiment pourquoi le fait d'avoir directement à la suite en mémoire tous les objets cela poserais problème pour le V.B.O? Je connais le principe du V.B.O mais c'est la première fois que je tombe sur ce problème.

    Une autre question que je me pose c'est "Est-ce que niveau performance cela ne baissera pas?"

    Je fais les modif et je reviens vers vous pour le résultat merci encore pour votre aide

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Il faudrait récupérer tous les sommets des sous objets, en stockant quelque part l'indice de début de chaque sous-objet.

    Je pense qu'en modifiant ta boucle de remplissage du VBO de la manière suivante, il y a possibilité que cela fonctionne:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    	std::vector<C_Model::TVertex> Vertices;
    	std::vector<C_Model::TIndex>  Indices;
    	size_t indexOffset = 0;
    	// Parcourt tous les objets qui compose le modèle
    	for (int i = 0; i < pModel.numOfObjects; i++){
     
    		if (pModel.pObject.size() <= 0) break;
     
    		// récupère l'objet courant
    		t3DObject *pObject = &pModel.pObject[i];
     
    		// Parcourt tous les vertices qui composent l'objet
    		for (int v = 0; v < pObject->numOfVerts; v++){
    			// Récupération des informations sur le sommet courant
    			C_Model::TVertex newVertex;
    			newVertex.Position = pObject->pVerts[v];
    			newVertex.Normal = *pObject->pNormals[v];
    			newVertex.Color = Renderer.ConvertColor(C_Color::White);
    			// ajoute le vertex au tableau de vertices
    			Vertices.push_back(newVertex);
    		}
     
    		// Parcourt toutes les faces qui composent l'objet
    		for (int j = 0; j < pObject->numOfFaces; j++){
    			// parcour les vertices qui compose la face
    			for (int k = 0; k < 3; k++)
    			{
    				// récupère l'index du vertex
    				int index = pObject->pFaces[j].vertIndex[k];
    				// ajoute l'index au tableau d'indices
     
    				// Indices.push_back(indexOffset + (j * 3 + 2 - k));  <----- si l'on met cette ligne = perso à moitier
    				Indices.push_back(indexOffset + index);  // <----- si l'on met cette ligne = perso avec des troues
    			}
    		}
     
    		indexOffset += pObject->numOfVerts;
    	}
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Je viens de réussir à afficher mon Model mais après pas mal de beug au niveau de la classe C_Mesh et C_Model.

    J'ai essayer de modifier ma boucle comme tu me la indiquer mais malheureusement voici le résultat avec les deux méthode :





    j'ai donc suivie ton premier conseil et créer une Classe C_Mesh supplémentaire pour pouvoir séparer tous les objets ce qui donne ceci :



    J'ai remarquer via les beug que j'ai eu que 16 objets qui devrais composer le Model et qui est trouver lors du chargement, seul 9 d'entre eux est composer de vertices et d'indices c'est pourquoi je me demande si le problème d'avant venais pas de la? comme je n'avais pas fait attention que certain objets était charger dans les buffer mais sans vertices et indices cela peut avoir causer ce problème?

    je vais essayer pour voir si cela fonctionne par curiosité car j'avais l'intension de créer une classe C_Mesh mais je voulais d'abord me concentrer sur le V.B.O.

    Merci encore pour ton aide je vais pouvoir me concentrer sur les texture maintenant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de rendu unity sur mobile avec remote4
    Par honosstoa dans le forum Unity
    Réponses: 3
    Dernier message: 25/10/2015, 15h47
  2. Réponses: 2
    Dernier message: 10/02/2015, 18h00
  3. problème de rendu avec DrawString
    Par megachameau dans le forum C#
    Réponses: 3
    Dernier message: 22/07/2010, 19h05
  4. [1.x] Problème de génération de model propel avec symfony 1.1
    Par youknowriad dans le forum Symfony
    Réponses: 2
    Dernier message: 04/07/2008, 16h13
  5. Problème de rendu avec des listes
    Par Erwane dans le forum Scheme
    Réponses: 19
    Dernier message: 03/03/2008, 21h27

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