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

OpenGL Discussion :

Multi-texturing heightmap [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Multi-texturing heightmap
    Bonjour,

    j'essaye de faire du multitexturing avec OpenGL 3.x+ mais je ne trouve presque pas de tutoriels sur ce sujet...

    Je trouve quelques bouts de code par ci par là mais rien de bien compréhensible.

    J'aimerai obtenir quelque chose qui ressemble à ça :



    je trouve la transition entre les textures super, par contre je vois pas du tout comment on peut obtenir un tel résultat, le multitexturing est-il suffisant ?

    Actuellement j'affiche ma heightmap de cette façon

    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
     
    		glVertexAttribPointer(this.m_shader.vertexIndex, 3, GL_FLOAT, false, 0, null);
     
    		glVertexAttribPointer(this.m_shader.textureIndex, 2, GL_FLOAT, false, 0, this.m_buffer.texturePtr);
     
    		glVertexAttribPointer(this.m_shader.colorIndex, 4, GL_UNSIGNED_BYTE, true, 0, this.m_buffer.colorPtr);
     
     
     
    		glUniformMatrix4fv(this.m_shader.modelViewLocation, 1, GL_TRUE, modelView.values_ptr);
     
    		glUniformMatrix4fv(this.m_shader.projectionLocation, 1, GL_TRUE, projection.values_ptr);
     
     
    		this.m_texture.bind();
     
     
    		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this.m_indicesBuffer);
     
    		glDrawElements(GL_TRIANGLES, this.m_indicesCount, GL_UNSIGNED_INT, null);
    Voir pièces jointes.

    Comment puis-je obtenir un tel résultat ?

    merci.
    Images attachées Images attachées   

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je pense qu'ils ont juste fondu les deux textures (alpha 0.5 pour les deux) pour faire ce rendu. Plus précisément, l'alpha de la texture d'herbe diminue lorsque l'on s'approche du sable et réciproquement pour le sable
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    merci pour ta réponse !

    après un peu de recherche et graçe à ce tuto , j'ai eu une petite idée.

    Pour faire ce que je voulais, on va avoir besoin de 3 textures

    - L'herbe
    - Le sable
    - et une texture un peu spéciale(alpha map)...:


    Par rapport au code présent sur mon premier post, j'ai rajouté cela (toujours avant l'affichage) :

    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
     
                          // Première texture
    		glActiveTexture(GL_TEXTURE0);
    		this.herbe.bind();
    		glUniform1i(glGetUniformLocation(this.m_shader.programID, "myTexture1"), GL_TEXTURE0 - GL_TEXTURE0);
     
    		// Deuxième texture - alpha map
    		glActiveTexture(GL_TEXTURE1);
    		this.speciale.bind();
    		glUniform1i(glGetUniformLocation(this.m_shader.programID, "myTexture2"), GL_TEXTURE1 - GL_TEXTURE0);
     
    		// Troisième texture
    		glActiveTexture(GL_TEXTURE2);
    		this.sable.bind();
    		glUniform1i(glGetUniformLocation(this.m_shader.programID, "myTexture3"), GL_TEXTURE2 - GL_TEXTURE0);
    Et le fragment shader qui va avec :
    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
     
    #version 140
     
    in vec2 texCoord;
    in vec4 color;
    out vec4 outputColor;
     
    uniform sampler2D myTexture1;
    uniform sampler2D myTexture2;
    uniform sampler2D myTexture3;
     
    void main()
    {
    	vec4 alphaMap = texture(myTexture2, texCoord);
     
    	outputColor = texture(myTexture1, texCoord) * alphaMap;
    }
    A ce stade là du fragment shader on obtient :



    si vous ne comprennez pas pourquoi voir le lien du tuto que j'ai donné plus haut.

    Maintenant on doit combler les gros trous noirs avec notre 3 ème texture, le fragment shader évolue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void main()
    {
    	vec4 alphaMap = texture(myTexture2, texCoord);
     
    	outputColor = texture(myTexture1, texCoord) * alphaMap;
     
    	// On inverse les couleurs de l'alphaMap 
    	lightMap = vec4(1.0 - alphaMap.rgb, alphaMap.a);
     
            // et fait comme au début mais cette fois avec la 3 ème texture
            outputColor += texture(myTexture3, texCoord) * alphaMap;
    }
    Résultat :


    Voilà, je débute avec les shaders et tout ça donc c'est possible que je fasse n'importe quoi, si vous avez une meilleur solution pas trop compliquée je suis preneur.

    Merci.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Moi, je trouve la solution intéressante. La texture de l'auréole, je pense que son nom sera une texture alpha (vu que c'est la composante alpha que vous voulez appliquer).

    Le rendu me semble nickel et c'est ce qui compte dans le monde de la 3D (vous pouvez faire les trucs les plus barbares, les plus cheatés, tant que le rendu final est convaincant, c'est ok ).

    Pour le code :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    lightMap = vec4(1.0 - lightMap.r, 1.0 - lightMap.g, 1.0 - lightMap.b, lightMap.a);
    Je crois que cela peut se simplifier comme ceci :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    lightMap = vec4(1.0 - lightMap.rgb, lightMap.a);
    Il fera bien l'opération 1-la composante, sur les trois spécifiées. Si le compilateur ne l'accepte pas, alors, mettez vec3(1.0) - lightMap.rgb
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre à l'essai
    Homme Profil pro
    graphique/réseau
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : graphique/réseau

    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Moi, je trouve la solution intéressante. La texture de l'auréole, je pense que son nom sera une texture alpha (vu que c'est la composante alpha que vous voulez appliquer).
    C'est vrai ça semble plus logique.

    Citation Envoyé par LittleWhite Voir le message
    Pour le code :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    lightMap = vec4(1.0 - lightMap.r, 1.0 - lightMap.g, 1.0 - lightMap.b, lightMap.a);
    Je crois que cela peut se simplifier comme ceci :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    lightMap = vec4(1.0 - lightMap.rgb, lightMap.a);
    Il fera bien l'opération 1-la composante, sur les trois spécifiées. Si le compilateur ne l'accepte pas, alors, mettez vec3(1.0) - lightMap.rgb
    Ah oui merci, c'est plus "beau" comme ça !

    Il ne me reste plus qu'à peaufiner tout ça et ça sera bon, je passe en résolu.

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

Discussions similaires

  1. glsl multi texturing
    Par F-fisher dans le forum OpenGL
    Réponses: 4
    Dernier message: 22/02/2010, 18h51
  2. Multi texture massif
    Par Bat'O dans le forum OpenGL
    Réponses: 12
    Dernier message: 03/10/2009, 14h36
  3. Vertex Arrays : Multy textures
    Par Nikowa dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/05/2009, 05h45
  4. Multi texture dans avec les VBO
    Par yvesall dans le forum OpenGL
    Réponses: 5
    Dernier message: 28/04/2009, 01h05
  5. [libjpeg && opengl] problème "multi-texturing"
    Par pspflashsystem dans le forum OpenGL
    Réponses: 4
    Dernier message: 23/02/2009, 13h01

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