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 :

GLSL et textures


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut GLSL et textures
    Bonjour,

    Petite question sur les shaders et le langage GLSL. (je suis débutant)
    Je veux créer un fragment shader qui modifie une texture en lui appliquant plusieurs traitements successifs. En gros un traitement qui modifie la couleur des pixels, et un autre qui "déforme" la texture en affectant à des pixels la valeur de pixels voisins.
    Je récupère sans problème un pixel de ma texture de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uniform sampler2D texIndex;
    void main(void)
    {
    	vec4 texColor = texture2D(texIndex, gl_TexCoord[0].st);
    Je commence par appliquer un premier traitement qui modifie simplement la couleur du pixel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	texColor = vec4(...); // Plus compliqué que ça bien sur...
    Ensuite je dois appliquer un traitement qui déforme la texture selon une sinusoide. Je dois donc faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	vec2 newTexCoord = gl_TexCoord[0].st;
    	newTexCoord .s = sin( ... );
    	texColor = texture2D(texIndex, newTexCoord .st);
    }
    Le problème est que si je fais ça je perds la modification de couleur que j'ai effectué juste avant!
    Ma question est donc, comment accéder non pas à la texture initiale, via texture2D(texIndex, distTexCoord.st), mais à la texture déjà modifiée précédemment?

    J'espère avoir été clair, je pense qu'il s'agit d'un problème basique mais je débute en glsl et la documentation est difficile à trouver.
    Merci d'avance.

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    la texture a l'entrée de ton fragment program est une donnée d'entrée en lecture seule, tu ne peux donc pas la modifier.

    pour modifier (ou plutôt récupérer une texture sur laquelle tu veux pouvoir faire des changements), il faut grosso modo :

    - que tu fasses le dessin d'un quad texturé avec la texture que tu veux modifier
    - dans topn fragment program, tu fais les modifications nécessaires
    - que tu fasses ton rendu dans une nouvelle texture qui contiendra ta texture modifiée.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Par défaut
    Salut,
    Merci pour ta réponse.

    - que tu fasses le dessin d'un quad texturé avec la texture que tu veux modifier
    - dans topn fragment program, tu fais les modifications nécessaires
    Euh, il me semble que c'est déjà ce que je fais, puisque j'arrive à récupérer le pixel de ma texture (qui est bien sur un quad en effet).
    J'ai oublié de préciser que je fais un gl_FragColor = texColor à la fin de mon shader, ce qui fonctionne dans le sens ou le pixel affiché à l'écran prend la valeur de texColor.

    Mon problème est juste de pouvoir accumuler des modifications sur texColor avant de le passer à gl_FragColor...

    Tu parles de faire le rendu dans une nouvelle texture? Comment puis-je créer une nouvelle texture dans mon shader, et lire/écrire dedans?

  4. #4
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    ha ok, je n'avais pas compris, je croyais que tu voulais à l'insu de ton rendu récupérer une texture avec les changements opérés.

    donc tu veux accumuler les opérations dans texColor, comme tu le mentionnes.

    uniform sampler2D texIndex;
    void main(void)
    {
    !!! vec4 texColor = texture2D(texIndex, gl_TexCoord[0].st);

    !!! texColor = vec4(...); // Plus compliqué que ça bien sur...

    vec2 newTexCoord = gl_TexCoord[0].st;
    newTexCoord .s = sin( ... );
    !!! texColor = texture2D(texIndex, newTexCoord .st);
    }
    dans ce code, aux lignes avec des points d'exclamation, tu fais un égal, c'est ça qui te fais perdre tes modifications au fur à mesure que le programme se déroule.

    selon ce que tu veux faire, il faudrait plutôt ajouter ou multiplier (sauf la première fois, pour initialiser ta variable) :
    - texColor +=
    - texColor *=


    sinon tu ne peux pas créer de nouvelle texture dans le programme, il faut que tu en attaches une au pipeline en sortie de celui-ci, en plus ça nécessite de rendre le quad en mode orthogonal avec un changement de la taille du viewport/depth-stencil; ce n'est pas trivial, et ça fait faire un rendu en plusieurs passes.

  5. #5
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Moi je serais toi je ferais l'inverse, je ferais d'abord la déformation (acquisition d'un pixel à une coordonnée différente), je modifierais la couleur de ce pixel puis je l'écrirais avec gl_FragColor.

    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
    uniform sampler2D texIndex;
    void main(void)
    {
    	// on calcul la coordonnée du pixel déformé
    	vec2 newTexCoord = gl_TexCoord[0].st;
    	newTexCoord.s = sin( ... );
     
    	// on fait l'acquisition de ce pixel
    	vec4 texColor = texture2D(texIndex, newTexCoord.st);
     
    	// on modifie la couleur de ce pixel, par exemple en passant de RGBA à BGRA
    	texColor = vec4(texColor.b,texColor.g,texColor.r,texColor.a);
     
    	// on écrit la valeur du pixel final
    	gl_FragColor = texColor;
    }
    Je pense que ce que tu voulais faire venait d'une petite incompréhension du fonctionnement des fragments shader, en voulant écrire là où le pixel devrait se trouver après déformation peut-être ? avec les shaders il faut avoir le raisonnement inverse. Et si ça ne peut fonctionner ainsi alors on utilise un rendu multipasse.
    Sinon, ce que tu essaye peut-être de faire c'est tout bonnement du blending et là tu devrais regarder les jolies formules liées à la fonction glBlendFunc (voir la doc) et les implémenter directement dans ton shader.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Sinon, pour faire ce que tu souhaite, il y à OpenCl, qui est très pratique pour ce genre d'opération. Il est possible de passer une texture opengl vers opencl et de la modifié à souhait.

+ 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. glsl osg texture
    Par clement.rey dans le forum OpenGL
    Réponses: 0
    Dernier message: 05/06/2009, 16h15
  3. [ GLSL ] et textures (débutant)
    Par scannerz57 dans le forum OpenGL
    Réponses: 2
    Dernier message: 24/12/2008, 14h01
  4. Réponses: 2
    Dernier message: 29/02/2008, 15h59
  5. GLSL : Affichage Texture
    Par Lhudel dans le forum OpenGL
    Réponses: 5
    Dernier message: 09/03/2007, 16h12

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