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 :

[OpenGL]Aide de compréhension texture Specular, diffuse, normal pour les Model 3D


Sujet :

C++

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut [OpenGL]Aide de compréhension texture Specular, diffuse, normal pour les Model 3D
    Bonjour,

    Je suis actuellement entrain de chercher à comprendre la théorie et la pratique sur le chargement d'un model 3D.

    J'utilise un loader 3DS et une fichier .3ds pour mieux comprendre (je passerais à ASSIMP une fois que j'aurais bien acquis les bases).

    Actuellement j'arrive à afficher mon Modèle 3D avec le calcule des normals et l'afficher :


    La ou je bloque un peu c'est avec les textures. Comme on peut le voir sur l'image ci-dessous je me retrouve avec toutes les texture (Nomal, Diffuse, Specular). J'aimerais savoir comment je doit procéder pour les utiliser avec OpenGL.

    Nom : texture.png
Affichages : 1031
Taille : 264,2 Ko

    Pour une texture je sais qu'il faut utiliser le Bind sur l'id de la texture mais comment sa ce passe pour toute ces textures? car j'ai les coordonnées de texture mais je bloque sur cette question.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Salut!

    Bienvenue dans le monde merveilleux du normal mapping!
    C'est une technique de multitexturing permettant de modifier les normales en fonction de ce que tu sample dans la texture de normales.
    Tu trouveras de plus amples explications ici: http://ogldev.atspace.co.uk/www/tuto...utorial26.html

    EDIT:

    Si tu pouvais mettre ton image avec les textures en pièce jointe de ton message, afin qu'on puisse les voir en plus grand, ça aiderait à te dire ce à quoi elles peuvent correspondre.
    Car je vois bien les normal maps (faciles à distinguer) mais tu en as d'autres, et il pourrait bien y avoir des opacity maps, et des specular maps.
    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).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Ha ok on m'en avait parler du multi texturing mais je mis était pas encor mis comme quoi sa arrive vite

    Merci Pour le lien je vais regarder sa et je reviens au cas ou j'aurais du mal à l'implémenter

    J'ai également mi l'image en pièce jointe je crois mais elle c'est agrandie dans le post précédent j'ai pas encor l'habitude des fonctionnalité de l'éditeur

    merci encore

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Je viens de voir le lien

    Le problème que j'ai par rapport à ça c'est comment je doit utiliser les texture en même temps comme l'image de gauche dans le lien?

    ma structure d'un objet dans le loader ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct t3DObject
    {
    	int  numOfVerts;			// The number of verts in the model
    	int  numOfFaces;			// The number of faces in the model
    	int  numTexVertex;			// The number of texture coordinates
    	int  materialID;			// The texture ID to use, which is the index into our texture array
    	bool bHasTexture;			// This is TRUE if there is a texture map for this object
    	char strName[255];			// The name of the object
    	SilverEngine::vector3f* pVerts;			// The object's vertices
    	SilverEngine::vector3f* pNormals;		// The object's normals
    	SilverEngine::vector2f* pTexVerts;		// The texture's UV coordinates
    	tFace* pFaces;				// The faces information of the object
    };
    Donc un Objet (Mesh) possède un ID de texture mais comme on peut le voir avec les textures par exemple j'ai deux images :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    arm_showroom_ddn.png
    arm_showroom_spec.png
    J'ai également remarquer que je récupère que 12 texture sur les 23 donc je pense que le loader n'est pas complet je l'est pris sur le depot de GameTutorial

    Donc si j'ai bien compris pour le moment je devrais avoir plusieurs Material pour un Objet pour ensuite pouvoir faire du multi texture?

    je vais essayer de voir comment je peut faire pour récupérer les 23 textures pour le moment car sinon je part déja sur une mauvaise base je pense.

  5. #5
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Salut!

    Donc effectivement, tu as des diffuse map (texture "de couleur", _dif), des normal map (_ddn), des specular map (_spec) et des opacity map (_alpha).

    je récupère que 12 texture sur les 23
    Qu'entends-tu par là?
    Comment "récupères"-tu une texture?
    Sais-tu lesquelles tu récupères?

    EDIT:

    Ensuite, pour ton material ID, c'est très réducteur, de définir un matérial comme étant juste une texture.
    En effet, comme tu peux déjà le remarquer, tu peux avoir plusieurs textures.
    De plus tu peux avoir d'autres caractéristiques propres au matériau: Ambient, diffuse, specular (pour du phong lighting), alpha...
    Je ne peux que te conseiller d'écrire une classe Material qui te permettra de regrouper ces informations.

    Ensuite, j'ai moi même écrit un loader 3DS pour mon moteur, et même si j'utilise maintenant Assimp, le code que j'ai écrit est toujours valide.
    Si tu penses que le loader que tu as récupéré n'est pas complet, tu peux toujours voir si le mien apporte d'autres choses (il n'est pas complet non plus, mais on ne sait jamais). Tu le trouveras ici: https://github.com/DragonJoker/Casto...axImporter/Src
    Je ne peux que te conseiller d'utiliser Assimp. Utiliser un loader spécifique ne t'apportera rien d'autre que la connaissance de ce format spécifique, ce qui au final, ne sert à pas grand chose... (ou bien tu souhaites faire une thèse sur le format 3DS?)
    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).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Salut,

    Lorsque je remplie mon tableau des textures récupérer par les objets avec le Loader j'obtiens ceci :

    Nom : materials.jpg
Affichages : 881
Taille : 5,2 Ko

    on peut voir que certaine on un path et d'autre non. Par contre j'ai remarquer hier en essayant de changer de loader (obj), que le modèle n'avait pas certaine texture. Quand j'ai voulu exporter avec 3DS max studio le model en .OBJ il à indiquer qu'il ne trouvais pas "helmet_d.png" ainsi que d'autre textures.
    Donc je pense que certaine texture on été renommer après l'export de base.

    J'ai trouver le Model sur TF3DM.

    En regardant ton Loader j'ai remarquer en effet que le Loader que j'avais récupérer n'avais pas pris en compte tous les chunks materials voici les case du switch Materials dans mon Loader:

    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
     
                     case MATNAME: 
    			currentChunk.bytesRead += fread(pModel->pMaterials[pModel->numOfMaterials - 1].strName, 1, currentChunk.length - currentChunk.bytesRead, m_FilePointer);
    			break;
     
    		case MATDIFFUSE: 
    			ReadColorChunk(&(pModel->pMaterials[pModel->numOfMaterials - 1]), &currentChunk);
    			break;
     
    		case MATMAP: 
     
    			ProcessNextMaterialChunk(pModel, &currentChunk);
    			break;
     
    		case MATMAPFILE:	
     
    			currentChunk.bytesRead += fread(pModel->pMaterials[pModel->numOfMaterials - 1].strFile, 1, currentChunk.length - currentChunk.bytesRead, m_FilePointer);
    			break;
    ou bien tu souhaites faire une thèse sur le format 3DS?
    Pas particulièrement mais comme j'ai appris avec ce format en cours je l'avais garder. Mais comme tu me la conseiller je pense que je vais me mettre à ASSIMP car je veux pas apprendre 3DS mes plutôt la bonne théorie et cheminement à avoir pour charger un Model 3D pour ensuite finir sur l'Animation squelettique mais sa sera après avoir bien compris les textures car j'ai compris les Base pour charger un Modèle.

    Pour faire une petit résumer de se que j'ai compris :

    Un Model possède :
    des Objets (Mesh)
    des Matériaux
    des Faces

    Pour le récupérer :
    - on récupère les informations avec un Loader
    - on récupère tous les objets qui le compose
    - on récupère la géométrie (vertices) que l'on stock dans un tableau
    - on calcule la normale des vertices si l'on à pas de texture speculaire
    - on récupère tous les matériaux relier à l'objet <-- (comme tu me la indiquer)
    - on récupère les textures que l'on stock dans un tableau
    - on charge les textures avec un loader correspondant au extension d'images
    - on récupère les faces dans un tableau
    - on récupère les index de vertices enregistrer pour les faces dans un tableau

    pour l'afficher :
    - on parcour le nombre d'objets qui compose le modèle
    - on parcoure toutes les faces de l'objets
    - on parcour les 3 vertices qui compose cette face
    - on bind les différentes textures pour cette objet
    - on met la couleur correspondants au vertex
    - on met la normal de verte si on a pas de teture speculaire
    - on affiche le vertex

    Je vais également faire comme tu me la indiquer une classe pour les materiaux par contre les matériaux sont relier aux objets ou aux faces? je veux pas dir de bétise mais je crois avoir vue qu'il était possible qu'une face possède plusieurs matériaux?

    Je vais installer ASSIMP et essayer de charger le modèle.

    Merci encore pour ton aide en se moment tu m'aide pas mal

  7. #7
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Je ne comprends pas ta séparation objets/faces.
    Dans mon moteur, un modèle, c'est:
    • Un Mesh, constitué de Submesh (1 ou plusieurs)
    • Un Material par Submesh


    Un Submesh étant constitué de:
    • Vertices
    • Faces


    Du coup, le Material est lié au Submesh.

    - on calcule la normale des vertices si l'on à pas de texture speculaire
    Aucun rapport entre les deux.
    Il vaut mieux récupérer les normales, si elles existent, sinon on les crée, de manière à ce qu'un Submesh ait toujours des normales.


    En utilisant ASSIMP, ton boulot devient autre chose:
    • Charger le(s) fichier(s) contenant le(s) modèle(s)
    • Pour chaque objet (Submesh) du modèle récupéré:
      • Charger les sommets (position, normale, tangente et bitangente) dans le VBO
      • Charger les indices des sommets constituant les faces dans l'IBO
      • Charger le matériau utilisé par l'objet


    Et pour le dessin, ne me dis pas que tu fais cela à chaque tour de boucle...

    Tu peux aussi voir mon loader Assimp, pour plus de détails: https://github.com/DragonJoker/Casto...mpImporter/Src
    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).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    ha ok donc j'ai mal compris certaine chose. Maintenant je comprend un peu mieux pour les Mesh et Matériaux par contre pour :

    - on calcule la normale des vertices si l'on à pas de texture speculaire
    Aucun rapport entre les deux.
    Il vaut mieux récupérer les normales, si elles existent, sinon on les crée, de manière à ce qu'un Submesh ait toujours des normales.
    va falloir que je regarde plus en profondeur comme tu me la indiquer le normal mapping pour bien comprendre cette texture.

    Et pour le dessin, ne me dis pas que tu fais cela à chaque tour de boucle...
    Non non j'utilise le V.B.O et I.B.O c'est juste se que j'avais compris sans utiliser le V.B.O pour le coter théorique

    Merci pour le lien je vais essayer de m'inspirer de sa

    Je reviens mettre le résultat une fois que j'ai réussie à afficher mon Model plus la texture.

    Merci encor pour ton aide

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Bon je reviens après pas mal de recherche sur le web car j'ai chercher toute la journée mais impossible de faire fonctionner la librairie ASSIMP

    J'ai télécharger toutes les versions de assimp (binaire et non binaire) de la version 3.0 et 3.1 mais impossible de la faire fonctionner avec visual studio 2013 Express.

    j'ai créer ma classe C_ModelLoader dans ma dll de mon moteur c++ donc j'ai ajouter les lien vers la lib à mon projet du moteur (tous compile sans problème) :

    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
     
     
    //==========================================================
    // En-têtes
    //==========================================================
    #include <ResourcesManager/Loaders/C_ILoader.h>
    #include <Core/C_Model.h>
    #include <vector>
     
    // ASSIMP
    #include <assimp/Importer.hpp>
    #include <assimp/scene.h>    
    #include <assimp/postprocess.h>
     
    namespace SilverEngine{
    	////////////////////////////////////////////////////////////
    	/// Classe prenant en charge l'importation des modèles
    	////////////////////////////////////////////////////////////
    	class SILVERENGINE_API C_ModelLoader : public C_ILoader<C_Model>{
    		public:
     
    			//----------------------------------------------------------
    			// Charge un modèle à partir d'un fichier
    			//----------------------------------------------------------
    			virtual C_Model* loadFromFile(const std::string& Filename);
     
    	protected:
    		std::vector<C_Mesh> m_meshes;
     
    	private:
     
    		bool initModel(const aiScene* pScene, const std::string& Filename);
     
    		void ProcessMeshes(const aiMesh* paiMesh, unsigned int p_index);
    	};
    }
    mais quand j'utilise la dll du moteur dans un projet test, au moment de l'exécution je me retrouve avec cette erreur :

    Erreur 5 error C1083: Impossible d'ouvrir le fichier include : 'assimp/Importer.hpp' : No such file or directory c:\users\ksta\desktop\dll\sources\silverengine\resourcesmanager\loaders\c_modelloader.h 36 1 TestDLL
    je précise également ma configuration dans le moteur :

    c/c++ -> Autre répertoire include -> $(SolutionDir)../../ExtLibs/Assimp/include
    Éditeur de liens -> Répertoire de bibliothèques supplémentaires -> $(SolutionDir)../../ExtLibs/Assimp/lib
    Éditeur de liens -> Dépendance supplémentaire -> assimp.lib

    serait-tu d'ou pourrais venir cette erreur? car j'ai essayer toutes les solutions que j'ai trouver sur internet en changeant la version, binaire etc... mais aucun succès

    j'ai remarquer que le correcteur automatique lors de la saisie des include me trouvais bien les fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // ASSIMP
    #include <assimp/Importer.hpp>
    #include <assimp/scene.h>    
    #include <assimp/postprocess.h>
    je comprend pas du tous se qui se passe il devrais trouver le fichier pourtant

    Édit :

    J'ai trouvée la réponse en essayant quelque chose et sa à marcher. Mais je comprend pas la solution.

    J'ai une DLL qui est mon moteur qui possède et utilise la librairie ASSIMP, j'ai un projet test qui utilise le moteur.

    Je doit ajouter le lien de la librairie ASSIMP au Moteur et au projet test est-ce que c'est normal? c'est la première fois que je créer et utilise une DLL car je voulais faire un code qui m'éviterais de recopier le code dans chaque projet mais je comprend pas pk je devrais faire le link de ASSIMP dans les deux projet.

  10. #10
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    C'est parce que tu n'as pas bien isolé ton loader.

    Pour résoudre ton problème, il faudrait ne mettre les includes des fichiers d'Assimp que dans les .cpp.
    Ca évitera que tout fichier incluant C_ModelLoader.h doive avoir les paths d'Assimp.
    Par contre il faut remanier ta classe C_ModelLoader pour qu'elle n'utilise pas les objets d'Assimp dans les appels de ses fonctions, ou tu peux tenter de prédéclarer les classes aiScene et aiMesh.

    Autre méthode: développer ton loader en tant que plug-in (donc DLL séparée) ce qui résoudra ton soucis, car lors de l'inclusion des fichiers du moteur, ceux du plug-in ne seront pas inclus. Par contre ça implique la mise en place du chargement dynamique de ton plugin par ton moteur. (Tu remarqueras que c'est ce que j'ai fait dans mon moteur)
    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).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Salut

    Pour résoudre ton problème, il faudrait ne mettre les includes des fichiers d'Assimp que dans les .cpp.
    En effet j'avais essayer cette solution mais il a pas aimer aiScene et aiMesh maais j'avais pas penser à essayer de les définir.

    Autre méthode: développer ton loader en tant que plug-in (donc DLL séparée) ce qui résoudra ton soucis, car lors de l'inclusion des fichiers du moteur, ceux du plug-in ne seront pas inclus. Par contre ça implique la mise en place du chargement dynamique de ton plugin par ton moteur. (Tu remarqueras que c'est ce que j'ai fait dans mon moteur)
    En effet j'avais remarquer en regardant ton code que tu avais fait une class Importer et plugin mais je pensais ne pas avoir à le faire. Mais je vais faire comme tu me la conseiller je vais faire une dll dynamique sa m'évitera de définir les type ainsi que de refaire le link de ASSIMP

    Je vais essayer sa et je reviens pour le résultat

    merci encore de ton aide

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Salut

    Je reviens car j'ai enfin réussie à récupérer chaque matérials et à bien les lier au Mesh correspondant.

    Voici ma classe C_Material:
    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
    42
    43
    44
    45
    46
    47
    48
    49
     
    class C_Material{
    		public:
     
    			C_Material();
     
     
    			std::string*  getName();
    			void		  setName(std::string& p_name);
    			// id du materiel
    			int			  getMaterialId();
    			void		  setMaterialId(int p_materialId);
    			// opacity
    			float		  getOpacity();
    			void		  setOpacity(float p_opacity);
    			// ambient
    			vector3f*	  getAmbient();
    			void		  setAmbient(vector3f& p_ambient);
    			void		  setAmbient(float p_r, float p_g, float p_b);
    			// diffuse
    			vector3f*	  getDiffuse();
    			void		  setDiffuse(vector3f& p_diffuse);
    			void		  setDiffuse(float p_r, float p_g, float p_b);
    			// specular
    			vector3f*	  getSpecular();
    			void		  setSpecular(vector3f& p_specular);
    			void		  setSpecular(float p_r, float p_g, float p_b);
    			// specular
    			vector3f*	  getEmissive();
    			void		  setEmissive(vector3f& p_emissive);
    			void		  setEmissive(float p_r, float p_g, float p_b);
    			// textures
    			std::vector<C_Texture*>*  getTexturesMaterial();
    			void					  setTextureMaterial(std::vector<C_Texture*>& p_textures);
    			void					  addTextureMaterial(C_Texture* p_materialPath);
     
    		protected:
    			std::string			    m_name;	         // Nom
    			int					    m_materialId;	 // id 
    			float				    m_opacity;		 // opacitée 
    			vector3f			    m_ambient;		 // couleur ambient
    			vector3f			    m_diffuse;       // couleur diffuse
    			vector3f			    m_specular;      // couleur speculaire
    			vector3f			    m_emissive;      // couleur emissive
    			std::vector<C_Texture*> m_texture;       // toutes les textures associées à ce matériel
     
    		private:
    			void initMaterial();
    	};
    J'ai réussie à afficher mon model (j'ai du changer le format du model car il manquais des textures), maintenant la question que je me pose c'est comment je doit faire pour mettre toutes mes textures sur le mesh correspondant?

    en regardant la documentation de aiMaterial je n'est pas réussie à savoir quelle texture il fallais utiliser en premier car je pense qu'il faut utiliser toutes les textures dans un ordre précis avant de faire un render du mesh non?

    un exemple de textures que je récupère pour un Mesh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_AMBIENT,   0), name_ambTexture);  // "hand_showroom_refl.png"
    		pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE,    0), name_difTexture);    // "hand_dif.png"
    		pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_NORMALS,   0), name_nmlTexture);  // ""
    		pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_HEIGHT,      0), name_hgtTexture);  // "hand_showroom_ddn.png"
    		pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_OPACITY,    0), name_opaTexture);  // ""
    		pMaterial->Get(AI_MATKEY_TEXTURE(aiTextureType_SPECULAR,   0), name_spcTexture);  // "hand_showroom_spec.png"
    Une autre question que je me pose car j'ai remarquer dans aiMesh il y a "mNumUVComponent" et donc comment savoir à quel texture cela correspond? car comme dans l'exemple au dessus il y à 4 textures.

    Et une dernier petit question car je trouve cela bizarre, je récupère ma texture de normal dans la propriété "aiTextureType_HEIGHT" et non dans "aiTextureType_NORMALS" est-ce normal?

    désoler si cela fait beaucoup de questions mais j'ai passer pas mal de temps à regarder sur internet mais il y a des choses qui m'échappe encore.

  13. #13
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par ksta.k Voir le message
    J'ai réussie à afficher mon model (j'ai du changer le format du model car il manquais des textures), maintenant la question que je me pose c'est comment je doit faire pour mettre toutes mes textures sur le mesh correspondant?

    en regardant la documentation de aiMaterial je n'est pas réussie à savoir quelle texture il fallais utiliser en premier car je pense qu'il faut utiliser toutes les textures dans un ordre précis avant de faire un render du mesh non?
    Pas forcément d'ordre : chaque texture à un rôle, tant que tu respecte ce rôle c'est bon.

    Citation Envoyé par ksta.k Voir le message
    Une autre question que je me pose car j'ai remarquer dans aiMesh il y a "mNumUVComponent" et donc comment savoir à quel texture cela correspond? car comme dans l'exemple au dessus il y à 4 textures.

    Et une dernier petit question car je trouve cela bizarre, je récupère ma texture de normal dans la propriété "aiTextureType_HEIGHT" et non dans "aiTextureType_NORMALS" est-ce normal?
    Ya rien de normalisé pour les matériaux, assimp défini des rôles courant, mais c'est pas toujours parfaitement exact.

    Un mesh peut avoir plusieurs UV sets, et si tu as 2 UV sets (mNumUVComponent == 2), chaque vertex aura 2 coordonnées de textures. A priori dans ton exemple tu as 1 UV set (même mapping pour toutes tes textures donc).

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Pas forcément d'ordre : chaque texture à un rôle, tant que tu respecte ce rôle c'est bon.
    Ok donc je doit regarder les rôle de chacun et les utiliser correctement.

    Ya rien de normalisé pour les matériaux, assimp défini des rôles courant, mais c'est pas toujours parfaitement exact.
    merci pour cette précision c'est bien de le savoir car je pensais avoir fait une erreur quelque part.

    Un mesh peut avoir plusieurs UV sets, et si tu as 2 UV sets (mNumUVComponent == 2), chaque vertex aura 2 coordonnées de textures. A priori dans ton exemple tu as 1 UV set (même mapping pour toutes tes textures donc).
    Le problème justement c'est que chaque Mesh possède "mNumUVComponent == 2". J'ai du mal à comprendre cette variable car chaque Mesh possède ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mNumUVComponent => 2
    mTextureCoords =>
         [0] => {x= 0.5, y= 0.5, z= 0 ........} <- exemple
         [1] = > NULL
         [2] = > NULL
         [3] = > NULL
         [4] = > NULL
    Le problème également que j'ai c'est que maintenant en insérant les texture et coordonnées de texture dans mon V.B.O et en les utilisants cela m'affiche mon model comme avant (blanc) et sans texture donc aucun changement.

    voici ma déclaration pour mon V.B.O:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                    TDeclarationElement Elements[] =
    		{
    			{ 0, ELT_USAGE_POSITION, ELT_TYPE_FLOAT3 },
    			{ 0, ELT_USAGE_NORMAL, ELT_TYPE_FLOAT3 },
    			{ 0, ELT_USAGE_DIFFUSE, ELT_TYPE_COLOR },
    			 {0, ELT_USAGE_TEXCOORD0, ELT_TYPE_FLOAT2}
    		};
    		m_Declaration = Renderer.CreateVertexDeclaration(Elements);
    voici comment je créer mes texture :
    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
     
            // Génération de la texture
    	unsigned int Texture;
    	glGenTextures(1, &Texture);
     
    	// Activation de la texture
    	glBindTexture(GL_TEXTURE_2D, Texture);
     
    	// Initialisation de quelques paramètres (filtrage, wrapping, ...)
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
     
    	GLint alignment;
    	glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
    	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
     
    	vector2i sizeTexture = p_image.GetSize();
     
    	gluBuild2DMipmaps(GL_TEXTURE_2D, p_image.GetFormat(),
    		sizeTexture.x, sizeTexture.y,
    		GL_RGBA, GL_UNSIGNED_BYTE, p_image.GetData());
     
    	glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
     
     
    	// Désactivation de la texture
    	glBindTexture(GL_TEXTURE_2D, 0);
    et voici comment je les utilise dans mon rendu du mesh :
    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
     
                    Renderer.SetDeclaration(m_Declaration);
    		// parcour toutes les textures que possède le mesh
    		for (int  i = 0; i < m_material->getNumTexOfMaterial(); i++){
    			Renderer.SetTexture(i, m_material->getTexturesMaterialById(i)->GetTexture());
                             /*
                                  // Ceci est ce qui est dans la fonction SetTexture
                                  glActiveTexture(GL_TEXTURE0 + i);
    		              glEnable(GL_TEXTURE_2D);
    		              glBindTexture(GL_TEXTURE_2D, OGLTexture->GetOGLTexture()); <-- id OpenGL de la texture (chaque texture est bien générée)
                              */
    		}
    		Renderer.SetVertexBuffer(0, m_VertexBuffer);
    		Renderer.SetIndexBuffer(m_IndexBuffer);
    		Renderer.DrawIndexedPrimitives(PT_TRIANGLELIST, 0, m_IndexBuffer.GetCount() / 3);
    Le problème que je vois avec cette essaie c'est que j'active une seul texture lorsque j'utilise ma déclaration mais que j'active les d'autre texture comme je parcours plusieurs texture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                           case ELT_USAGE_TEXCOORD0:
    			glActiveTexture(GL_TEXTURE0);
    			glEnable(GL_TEXTURE_2D);
    			glClientActiveTexture(GL_TEXTURE0);
    			glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    			glTexCoordPointer(Size[i->Type], Type[i->Type], Stride, BUFFER_OFFSET(i->Offset + MinVertex * Stride));
    C'est à ce niveau la que je bloque, comment faire utiliser toutes les textures et les afficher?

    merci de ton aide

  15. #15
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par ksta.k Voir le message
    Le problème justement c'est que chaque Mesh possède "mNumUVComponent == 2". J'ai du mal à comprendre cette variable car chaque Mesh possède ceci :
    Après vérification
    mNumUVComponent -> dimension de tes coordonnées de textures (2d / 3d); ici 2
    int aiMesh::GetNumUVChannels() -> retourne le nombre d'UV sets; ici 1

    Citation Envoyé par ksta.k Voir le message
    Le problème également que j'ai c'est que maintenant en insérant les texture et coordonnées de texture dans mon V.B.O et en les utilisants cela m'affiche mon model comme avant (blanc) et sans texture donc aucun changement.

    C'est à ce niveau la que je bloque, comment faire utiliser toutes les textures et les afficher?
    Crée plusieurs textures, bind les toutes et tu pourras les utiliser dans tes shaders : tu auras plusieurs sampler2D et plusieurs appels à texture2D.

    Quelque chose comme ça
    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
    // Vertex shader
    uniform mat4 worldView;
    uniform mat4 project;
     
    in vec3 position;
    in vec3 normal;
    in vec2 texCoords;
     
    out vec3 o_normal;
    out vec2 o_texCoords;
     
    void main() {
        gl_Position = project * worldView * position; // Aucune idée de si l'ordre est bon ou pas
     
        o_normal = normal;
        o_texCoords = texCoords;
    }
    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
    // Fragment shader
    uniform sampler2D diff; // un sampler par texture
    uniform sampler2D nm;
    // ...
     
    in vec3 o_normal;
    in vec2 o_texCoords;
     
    void main() {
     
        // diffuse
        vec4 diffuse = texture2D(diff, o_texCoords);
     
        // normal map - tangeant space
        vec3 nmts = texture2D(nm, o_texCoords).rgb;
     
        vec3 computedNormals = /* quelques chose avec o_normals et nmts */;
     
        // calculs des lumières en prenant en compte les normales que tu vient de calculer
        // ...
     
        // puis assignation du résultat
        gl_FragColor = /* ... */;
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Après vérification
    mNumUVComponent -> dimension de tes coordonnées de textures (2d / 3d); ici 2
    int aiMesh::GetNumUVChannels() -> retourne le nombre d'UV sets; ici 1
    ok je comprend mieux donc tout est ok pour les coordonnées de textures.

    Crée plusieurs textures, bind les toutes et tu pourras les utiliser dans tes shaders : tu auras plusieurs sampler2D et plusieurs appels à texture2D.
    Donc si j'ai bien compris, pour les textures (Diffuse, Normal, Speculaire) on peut voir le résultat à l’œil quand utilisant les Shaders?

    Merci de ton aide je comprend un peu mieux maintenant. Je vais implémenter les Shaders et je reviens donner le résultat

Discussions similaires

  1. aide à la compréhension d'un script
    Par miltone dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/01/2009, 17h29
  2. Petite aide et compréhension à mon problème
    Par swirtel dans le forum Boost
    Réponses: 5
    Dernier message: 10/09/2007, 14h24
  3. ATI et OpenGL - Aide
    Par Virviak dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/03/2005, 09h58

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