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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 1030
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 : 880
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).

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