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 :

Appliquer un shader sur un sprite Batch


Sujet :

OpenGL

  1. #1
    Membre éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut Appliquer un shader sur un sprite Batch
    Bonjour,
    Je programme un jeu avec libGDX. Je souhaite rendre tous les pixels d'un sprite en blanc (un peu comme le flash du L-cancel dans Project M). Le premier problème c'est que la fonction Sprite.setColor(Color.WHITE) ne le met pas en blanc mais enlève toutes applications de couleur.

    J'ai un peu recherché et je suis tombé sur les fameux shaders.

    Voici le fichier vs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    attribute vec4 a_position;
    attribute vec2 a_texCoord0;
    uniform mat4 u_projTrans;
     
    void main()
    {
        v_texCoords = a_texCoord0;
        gl_Position =  u_projTrans * a_position;
    }
    et voici le fichier fs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef GL_ES
        precision lowp float; //since the only value we're storing is part of a color
    #endif
     
    varying vec2 v_texCoords;
    uniform sampler2D u_texture;
     
    void main()
    {
        float alpha = texture2D(u_texture, v_texCoords).a;
        gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
    }
    J'ai d'abord initialisé le vertex et le fragment shader avec ces trois lignes (GameManager étant ma classe principale du jeu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ShaderProgram.pedantic = false;
     
    GameManager.defaultShader = SpriteBatch.createDefaultShader();
     
    GameManager.shaderWhiteTexture = new ShaderProgram(Gdx.files.internal("vertexShader.vs").readString(),Gdx.files.internal("fragShader.fs").readString());
    ensuite lorsque j'applique shaderWhiteTexture à mon spritebatch, il ne le met pas en blanc mais en transparent....
    Pourtant, il me semble que la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
    met en blanc les pixels... Je ne comprends pas.

    J'appelle donc à votre aide!

  2. #2
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Salut!
    Il semblerait donc que 'alpha' vaut 0.
    Tu peux le vérifier en changeant gl_FragColor comme suit : gl_FragColor = vec4(alpha, 0.0, 0.0, 1.0);
    Il devrait alors t'afficher noir pour les parties full transparentes, et un dégradé noir/rouge pour les parties semi transparentes.
    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 éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut
    Je viens d'essayer ta solution, mais le même résultat se produit, les sprites concernés deviennent transparents!
    Que faire?

  4. #4
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Tu peux montrer le code de ton shader modifié, du coup ?
    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 éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut Enfin! J'ai trouvé ce que je voulais!
    Suite à quelques bidouillages, j'ai changé le vertex shader
    Avant c'était comme ça le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    attribute vec4 a_position;
    attribute vec2 a_texCoord0;
    uniform mat4 u_projTrans;
     
    void main()
    {
        v_texCoords = a_texCoord0;
        gl_Position =  u_projTrans * a_position;
    }
    Et maintenant c'est :
    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
     
    attribute vec4 a_position;
    attribute vec4 a_color;
    attribute vec2 a_texCoord0;
     
    uniform mat4 u_projTrans;
     
    varying vec4 v_color;
    varying vec2 v_texCoords;
     
    void main() {
        v_color = a_color;
        v_texCoords = a_texCoord0;
        gl_Position = u_projTrans * a_position;
    }
    Et le résultat marche comme attendu!
    Nom : Capturewhite shader.PNG
Affichages : 216
Taille : 58,7 Ko
    Comme on peut le voir, je suis parvenu à "colorier" mes sprites en blanc.

    Mais j'aimerais bien avoir, s'il vous plaît, quelques clarifications à propos des programmes utilisées. Comment le code ne colorie pas les pixels transparents, où est la condition qui gère la transparence?
    Cordialement

  6. #6
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Pour pouvoir te répondre, il me faudrait voir ton fragment shader
    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).

  7. #7
    Membre éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut
    Le fragment shader je ne l'ai pas changé.
    Le voici :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifdef GL_ES
        precision lowp float; //since the only value we're storing is part of a color
    #endif
     
    varying vec2 v_texCoords;
    uniform sampler2D u_texture;
     
    void main()
    {
        float alpha = texture2D(u_texture, v_texCoords).a;
        gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
    }


    et voici le vertex shader :
    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    attribute vec4 a_position;
    attribute vec4 a_color;
    attribute vec2 a_texCoord0;
     
    uniform mat4 u_projTrans;
     
    varying vec4 v_color;
    varying vec2 v_texCoords;
     
    void main() {
        v_color = a_color;
        v_texCoords = a_texCoord0;
        gl_Position = u_projTrans * a_position;
    }

    Qu'est-ce qui fait que ça change les pixels en blanc sans toucher les pixels transparents

  8. #8
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Ben tu récupères l'alpha depuis ta texture (comme avant) : float alpha = texture2D(u_texture, v_texCoords).a;[br]
    Et tu mets la couleur finale en blanc, avec cet alpha : gl_FragColor = vec4(1.0, 1.0, 1.0, alpha);
    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).

  9. #9
    Membre éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut
    D'accord, mais qu'est-ce qui fait que ce vertex shader :

    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    attribute vec4 a_position;
    attribute vec2 a_texCoord0;
    uniform mat4 u_projTrans;
     
    void main()
    {
        v_texCoords = a_texCoord0;
        gl_Position =  u_projTrans * a_position;
    }

    fait n'importe quoi

    et que celui-ci

    Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    attribute vec4 a_position;
    attribute vec4 a_color;
    attribute vec2 a_texCoord0;
     
    uniform mat4 u_projTrans;
     
    varying vec4 v_color;
    varying vec2 v_texCoords;
     
    void main() {
        v_color = a_color;
        v_texCoords = a_texCoord0;
        gl_Position = u_projTrans * a_position;
    }

    fait correctement les choses?

  10. #10
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 476
    Points
    11 476
    Billets dans le blog
    11
    Par défaut
    Effectivement étrange, ça me semble plus lié à libGDX qu'à OpenGL (surtout que tu n'utilises pas v_color dans ton fragment shader)
    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).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/03/2014, 12h15
  2. Appliquer un shader sur un objet 3d simple
    Par n2engineer5 dans le forum API graphiques
    Réponses: 2
    Dernier message: 07/02/2012, 09h40
  3. Réponses: 1
    Dernier message: 27/11/2008, 11h41
  4. Appliquer un shader sur le rendu final
    Par Lockscash dans le forum DirectX
    Réponses: 10
    Dernier message: 19/06/2007, 17h05
  5. [icone]Comment appliquer une icone sur le.exe
    Par JavaLeDirePartout dans le forum JBuilder
    Réponses: 7
    Dernier message: 24/07/2003, 17h28

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