Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolus][SFML 2.0] Shader  (Lu 5922 fois)

0 Membres et 1 Invité sur ce sujet

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
[Résolus][SFML 2.0] Shader
« le: Avril 23, 2012, 01:17:17 pm »
Bonjour,

Voila, ça fait quelques jours que j'essaye de faire quelque chose avec les Shader mais j'ai quelques problèmes. En effet, mon image devient blanche, au lieu de passer en noir et blanc.

Voici mon fichier "noirblanc.sfx":
uniform sampler2D texture;

void main()
{
    // On récupère la valeur du pixel courant de l'écran
    vec4 pixel = gl_Color;

    // On calcule son niveau de gris
    float gray = pixel.r * 0.39 + pixel.g * 0.50 + pixel.b * 0.11;

    // On écrit enfin le pixel final, en utilisant 50% du pixel de l'écran et 50% de sa version colorée

    gl_FragColor = vec4(gray,gray,gray,pixel.a);
}

Voici le code C++:
sf::Shader sh;
        sh.loadFromFile("noirblanc.sfx", sf::Shader::Fragment);
        sh.setParameter("texture", sf::Shader::CurrentTexture);
        sf::RenderStates r;
        r.shader = &sh;

J'obtient l'erreur suivante: "Texture "texture" not found in shader"

Qu'est-ce que je dois faire pour que ça fonctionne? Comment récupérer le pixel courant de l'image?

Merci d'avance!
« Modifié: Avril 24, 2012, 03:06:43 pm par Raitosan »

minirop

  • Sr. Member
  • ****
  • Messages: 254
    • Voir le profil
    • http://dev.peyj.com
Re : [SFML 2.0] Shader
« Réponse #1 le: Avril 23, 2012, 01:47:34 pm »
loadFromFile doit compiler directement le shader, donc il faut mettre le "setParameter" avant

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #2 le: Avril 23, 2012, 01:57:48 pm »
Ah effectivement, j'ai cette erreur en moins, merci :)

Mais mon image est toujours blanche :/
Comment est-ce que je peux récupérer la couleur du pixel actuel svp?
Merci!
« Modifié: Avril 23, 2012, 04:39:50 pm par Raitosan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #3 le: Avril 23, 2012, 06:08:47 pm »
Ca n'a pas réglé l'erreur, ça l'a masqué.

Le problème c'est que ton shader ne fait aucun lookup dans la texture, donc quand il est compilé la variable "texture" est virée par le compilateur GLSL et du coup elle n'existe plus quand tu essaye de lui affecter quelque chose.

Ceci :
vec4 pixel = gl_Color;
... récupère la couleur diffuse (globale) de l'entité, pas la couleur du pixel dans la texture.

Il y a plein de tutos GLSL et un exemple avec plein de shaders simples dans SFML donc je te laisse chercher... :)
Laurent Gomila - SFML developer

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #4 le: Avril 23, 2012, 06:19:52 pm »
Bah justement, si je poste ici c'est justement parceque je n'ai rien trouver.
Il me semble en plus qu'il y a des "raccourcis" pour avoir l'entrer et la sortie en SFML, ou alors ça a disparut?

Citer
Le problème c'est que ton shader ne fait aucun lookup dans la texture
Je n'ai pas trop compris, il faut que je fasse quoi donc?

Edit:
En mettant ça: vec4 texel = texture2D(texture,gl_TexCoord[0].st);
   vec4 pixel = texel * gl_Color;

j'obtiens bien mon image en noir et blanc. Mais pourquoi est-ce que ça fonctionne?
« Modifié: Avril 23, 2012, 06:24:51 pm par Raitosan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #5 le: Avril 23, 2012, 07:07:20 pm »
Citer
Il me semble en plus qu'il y a des "raccourcis" pour avoir l'entrer et la sortie en SFML, ou alors ça a disparut?
Ca a complètement disparu ; si tu lis la documentation de sf::Shader, tu verras que ça utilise maintenant du pur GLSL.

Citer
Je n'ai pas trop compris, il faut que je fasse quoi donc?
Ce que je veux dire c'est que le code de ton shader n'utilise pas la variable "texture". Il faut donc... l'utiliser :)

Citer
En mettant ça: vec4 texel = texture2D(texture,gl_TexCoord[0].st);
   vec4 pixel = texel * gl_Color;

j'obtiens bien mon image en noir et blanc. Mais pourquoi est-ce que ça fonctionne?
Ben parce que c'est le bon code peut-être ? ::)
Laurent Gomila - SFML developer

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #6 le: Avril 23, 2012, 07:22:06 pm »
Citer
si tu lis la documentation de sf::Shader
C'est fait, je cherchais justement un moyen de faire ce que je voulais, j'ai regarder le code d'exemple, mais il n'y avais aucun code GLSL.

Citer
Ce que je veux dire c'est que le code de ton shader n'utilise pas la variable "texture". Il faut donc... l'utiliser
Oui, merci j'avais compris, mais comment?

Citer
Ben parce que c'est le bon code peut-être ?
Merci de me prendre pour un imbécile, mais ce que j'ai demander c'est pourquoi, donc son fonctionnement.

là par exemple, je n'ai pas envoyer mon image en paramètre à mon shader. Pourtant le code fonctionne. Comment est-ce que le code sais que texture est cette image là? Si j'avais deux uniform sampler2D, chacun ayant différentes images, comment le code peu savoir lequel est lequel?

Sinon tu as dit que l'erreur est masquer, comment la corrige-t-on donc?

Merci d'avance...
« Modifié: Avril 23, 2012, 07:36:28 pm par Raitosan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #7 le: Avril 23, 2012, 08:25:41 pm »
Citer
C'est fait, je cherchais justement un moyen de faire ce que je voulais, j'ai regarder le code d'exemple, mais il n'y avais aucun code GLSL.
Je disais ça juste pour le fait que ce soit maintenant du GLSL pur. Je ne sous-entendais pas qu'il y avait un exemple de code dans la doc.

Citer
Oui, merci j'avais compris, mais comment?
Citer
Merci de me prendre pour un imbécile, mais ce que j'ai demander c'est pourquoi, donc son fonctionnement.
Désolé, je ne voulais pas te prendre pour un imbécile. Je voulais être sûr que tu avais bien lu la documentation, les exemples, etc. avant de venir poser tes questions -- c'est ce que je fais à chaque fois (c'est pour être sûr que la doc est bien faite, et si ce n'est pas le cas, trouver ce qui manque).
Mais en l'occurence la doc indique aussi que les shaders étant écrits en GLSL, la doc de SFML n'a pas vocation à l'apprendre et qu'il faut regarder les tutoriels dédiés à ce langage pour avancer dans l'écriture de shaders. Si tu ne regardes que la doc SFML tu n'arriveras pas à faire grand chose dans tes shaders, ça c'est clair :)

Citer
là par exemple, je n'ai pas envoyer mon image en paramètre à mon shader. Pourtant le code fonctionne. Comment est-ce que le code sais que texture est cette image là? Si j'avais deux uniform sampler2D, chacun ayant différentes images, comment le code peu savoir lequel est lequel?
Là :
sh.setParameter("texture", sf::Shader::CurrentTexture);
tu dis explicitement au shader que la variable "texture" contiendra la texture de l'objet que tu es en train de dessiner.

Citer
Sinon tu as dit que l'erreur est masquer, comment la corrige-t-on donc?
Et bien le code correct que tu nous as montré la corrige, non ?
Laurent Gomila - SFML developer

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #8 le: Avril 23, 2012, 09:20:42 pm »
Merci pour ta réponse.

Citer
Et bien le code correct que tu nous as montré la corrige, non ?
Je ne sais pas, suite au message de minirop donnant une solution, tu as marquer "
Ca n'a pas réglé l'erreur, ça l'a masqué.". C'est pour cela que je demande comment la corriger si elle est masqué.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #9 le: Avril 23, 2012, 10:31:26 pm »
Je parlais de ça :
Citer
En mettant ça: vec4 texel = texture2D(texture,gl_TexCoord[0].st);
   vec4 pixel = texel * gl_Color;

j'obtiens bien mon image en noir et blanc.
Ca règle le problème non ?
Laurent Gomila - SFML developer

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
Re : [SFML 2.0] Shader
« Réponse #10 le: Avril 24, 2012, 03:06:28 pm »
Ah ok, là oui effectivement ça règle le problème, merci.

 

anything