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 :

Comment conserver les textures en appliquant des shaders ?


Sujet :

OpenGL

  1. #1
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut Comment conserver les textures en appliquant des shaders ?
    Bonsoir,

    Débutant en shaders, j'aimerais pouvoir mettre au point mes shaders tout en conservant les textures de mon application.

    Tout d'abord, je déclare mes textures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Variables de stockage des textures
    GLuint textureMur[3];
    GLuint textureShotGun[3];
    GLuint textureShotGunHalo[3];
    Mes textures sont appelées grâce à une méthode de chargement de tga dans la fonction init() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	glEnable(GL_TEXTURE_2D);
    // [...]
    	LoadTGATextures("Data/shotgun.tga" , textureShotGun);
    	LoadTGATextures("Data/shotgun_halo.tga" , textureShotGunHalo);
    Avec le prototypage de la méthode loadTGATextures() suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int LoadTGATextures (const char *filename , GLuint texture[3]);
    Ensuite, pour la binder au moment voulu dans mon application, j'utilise par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBindTexture(GL_TEXTURE_2D, textureShotGun[filter]);
    Les textures s'affichent donc sans problème du côté de mon programme. Par contre, je ne sais pas vraiment comment m'y prendre pour que, lorsque j'applique des shaders, les textures restent affichées normalement.

    Des idées ?

    Je vous remercie

  2. #2
    Membre éprouvé
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Par défaut
    Bonjour,

    L'utilisation des shader remet pas mal en cause l'utilisation classique d'OpenGl.

    Pour utiliser les textures, il te faut utiliser les Sampler1D,Sampler2D ou Sampler3D au niveau de tes shader

    regarde de ce coté tu devrais trouver ton bonheur.
    http://nehe.gamedev.net/data/article...asp?article=21

    Cordialement.

  3. #3
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Merci Lharuun pour ton aide. Je vais cherche de ce côté alors et m'appuyer sur ton lien

    J'imagine que je vais devoir repenser un peu ma déclaration des textures côté API ?

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    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 035
    Billets dans le blog
    12
    Par défaut
    En fait non, ça ne change quasiment rien au niveau de la création, par contre, il te faudra la passer au shader via une variable dite 'uniform' (le lien que Lharuun t'a donné devrait t'aider à ce niveau)
    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 éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Bonjour,

    J'ai donc regardé sur le lien et tout fonctionne normalement. Seulement, j'ai du mal à comprendre ce qui se passe exactement. Voici le bout de code tout d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // vertex shader
    varying vec2 texture_coordinate;   
     
    void main()
    {
    	// Transforming The Vertex
    	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
     
    	// Passing The Texture Coordinate Of Texture Unit 0 To The
                 texture_coordinate = vec2(gl_MultiTexCoord0);
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // fragment shader
    varying vec2 texture_coordinate; uniform sampler2D my_color_texture;
     
     void main(void)
    {
    	// Sampling The Texture And Passing It To The Frame Buffer
    	gl_FragColor = texture2D(my_color_texture, texture_coordinate);
    }
    Je comprends bien la récupération de la position de chaque vertex avec transformations par gl_Position dans le vertex shader.
    Cependant, j'aurais quelques questions concernant la prise en compte des textures :

    - "texture_coordinate = vec2(gl_MultiTexCoord0);" Ici, dans le vertex shader, je ne comprends pas ce que représente gl_MultiTexCoord0 pour le shader. Je sais qu'il y a un lien avec les coordonnées de texture mais comment gère-t-il les différentes textures de l'écran (texture mur, texture arme, ...) juste avec ca ?

    - Après en gros texture_coordinate représente les coordonnées de texture appliqué à chaque pixel mais comment le shader fait la différence entre la texture d'arme et la texture des murs appliquées aux pixels (même question que plus haut en fait)


    - Peut être sagit-il de la déclaration "uniform sampler2D my_color_texture;" dans le fragment shader mais ici, même problème, comment gère-t-il les différentes textures dans my_color_texture.

    Aussi, pourquoi ne doit-on pas passer côté API une variable alors que la variable my_color_texture est uniform ?

    Merci

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Il FAUT passer la variable my_color_texture au shader depuis l'API. Et pour information, le shader n'a pas a gérer plusieurs textures dans le cas normal, puisque l'objet dessiné n'a qu'une seule texture a un moment donné (si tu dessines un mur, tu lui passes la texture de mur et c'est tout). En fait, je pense que ta confusion vient du fait que tu penses que le pixel shader est un post process qui s'applique a l'ecran une fois que tous les triangles sont dessinés, et ca n'est pas le cas du tout. Le pixel shader est appelé pour chaque pixel du triangle au moment ou tu dessines ta geometrie. Donc si tu as un mur et une arme dans la meme scene, ca passera d'abord sur le vertex shader paramétré pour le mur, puis son pixel shader, ensuite le vertex shader pour l'arme et enfin son pixel shader. Donc en gros, tes shaders ne s'appliquent que a ce que tu es en train de dessiner.

  7. #7
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    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 035
    Billets dans le blog
    12
    Par défaut
    gl_MultiTexCoord0 est une variable prédéfinie de GLSL qui contient les coordonnées de texture de la première texture ( activée avec glActiveTexture( GL_TEXTURE0); )
    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 éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Merci math_lab et dragonjoker59 pour vos explications.

    Citation Envoyé par math_lab
    Il FAUT passer la variable my_color_texture au shader depuis l'API
    Normalement oui, mais dans mon cas, je n'ai même pas eu besoin de le faire ...
    A part les différentes lignes du code de mon premier message concernant la manipulation des textures côté API, je n'utilise rien d'autre... :s Pourquoi ca fonctionne quand même ?

    Citation Envoyé par dragonjoker59
    gl_MultiTexCoord0 est une variable prédéfinie de GLSL qui contient les coordonnées de texture de la première texture ( activée avec glActiveTexture( GL_TEXTURE0); )
    Je n'utilise aucun glActiveTexture pourtant :s des glBindTexture quand je veux l'afficher mais c'est tout.

    Citation Envoyé par math_lab
    Donc si tu as un mur et une arme dans la meme scene, ca passera d'abord sur le vertex shader paramétré pour le mur, puis son pixel shader, ensuite le vertex shader pour l'arme et enfin son pixel shader. Donc en gros, tes shaders ne s'appliquent que a ce que tu es en train de dessiner.
    Donc si je comprends bien, imaginons qu'il traite un pixel de l'arme, il va exécuter le vertex shader puis le fragment shader et quand j'écris "gl_MultiTexCoord0 ", le shader sait que pour ce vertex, la texture a laquelle je fais référence est l'arme et il récupère les coordonnées de la texture à l'endroit du vertex donné ?
    De la même façon, lorsque je traite un pixel du mur, le shader sait que "gl_MultiTexCoord0 " fait référence à la texture du mur ... ?

    Ou alors, il le sait grâce à my_color_texture qui est déclaré uniform et qui devrait récupérer la texture passée par l'API mais je ne passe rien explicitement aux shaders :s

    Merci encore !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 46
    Par défaut
    Citation Envoyé par betsprite Voir le message
    Citation Envoyé par math_lab
    Il FAUT passer la variable my_color_texture au shader depuis l'API
    Normalement oui, mais dans mon cas, je n'ai même pas eu besoin de le faire ...
    A part les différentes lignes du code de mon premier message concernant la manipulation des textures côté API, je n'utilise rien d'autre... :s Pourquoi ca fonctionne quand même ?
    En fait lorsqu'il n'y a qu'un seul sampler dans le shader, OpenGL redirige automatiquement les glBindTexture vers ce sampler. Voilà pourquoi il n'est pas nécessaire d'utiliser my_color_texture dans l'API, mais seulement dans le shader.

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Citation Envoyé par betsprite Voir le message
    Donc si je comprends bien, imaginons qu'il traite un pixel de l'arme, il va exécuter le vertex shader puis le fragment shader et quand j'écris "gl_MultiTexCoord0 ", le shader sait que pour ce vertex, la texture a laquelle je fais référence est l'arme et il récupère les coordonnées de la texture à l'endroit du vertex donné ?
    De la même façon, lorsque je traite un pixel du mur, le shader sait que "gl_MultiTexCoord0 " fait référence à la texture du mur ... ?

    Ou alors, il le sait grâce à my_color_texture qui est déclaré uniform et qui devrait récupérer la texture passée par l'API mais je ne passe rien explicitement aux shaders :s
    Merci encore !
    Il sait que tu traites un pixel du mur parce qu'il sort tout juste du vertex shader du mur, qui est déclenché par l'appel de dessin du mur. Et comme au moment ou tu dessines le mur, tu as la texture du mur qui est 'bindée', c'est celle la qui sera utilisée (même si tu devrais en plus la passer en uniform, pour faire plus propre). Les variables TexCoord ne font pas référence a des textures, c'est juste la position du pixel qui doit être lu a cette position précise de ton objet, et donc que ce soit une texture ou une autre, ça change rien.

    Et pour les glActiveTexture, c'est normal: la texture 0 est activée par defaut, donc tu n'as pas besoin de le faire. Par contre, si tu voulais avoir plusieurs textures sur le même objet (pour faire du lightmapping ou du normalmapping par exemple), il faudrait activer la texture 0, faire le glBind, activer la texture 1 et faire un autre glBind de l'autre texture. Ensuite, tu passerais 0 et 1 comme attributs de sampler a ton shader.

  11. #11
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Merci beaucoup dridri85 et math_lab pour vos réponses très claires.

    Je comprends mieux maintenant et problème résolu !

    Merci encore

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/10/2009, 12h13
  2. Réponses: 2
    Dernier message: 29/08/2006, 16h27
  3. Réponses: 4
    Dernier message: 03/07/2006, 01h30
  4. Réponses: 10
    Dernier message: 26/05/2006, 23h11
  5. Réponses: 3
    Dernier message: 05/05/2006, 11h41

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