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

Auteur Sujet: shader et paramètres  (Lu 2634 fois)

0 Membres et 1 Invité sur ce sujet

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
shader et paramètres
« le: Mai 15, 2014, 01:19:28 am »
Bonjour,

je reviens à la charge avec mes shaders :D

J'ai essayé ce shader que j'ai écrit:

uniform sampler2D texturer;

void main() {
                vec4 pixN = texture2D(texturer, (gl_TexCoord[0].xy + vec2(1.0,1.0)) );
                gl_FragColor = pixN;
}

et dans mon code, après le chargement du shader, j'ai mis:

m_shader.setParameter("texturer", Shader.CURRENT_TEXTURE);

Mais vu que l'écran reste noir, j'ai douté du passage de la texture en paramètre.
Dès lors, ce que j'ai trouvé étrange, c'est que si j'écris

m_shader.setParameter("texresthyjdhsgfqerhturer", Shader.CURRENT_TEXTURE);

Je n'ai aucun message d'erreur à l'exécution... Pourtant il ne peut pas assigner cette variable, si?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : shader et paramètres
« Réponse #1 le: Mai 15, 2014, 08:12:18 am »
Tu dessines quoi comme entité avec ce shader ?

Citer
Je n'ai aucun message d'erreur à l'exécution..
Est-ce que d'autres messages d'erreur apparaissent bien sur la sortie standard (par exemple si tu tentes de charger une texture à partir d'un fichier qui n'existe pas) ?
Laurent Gomila - SFML developer

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
Re : shader et paramètres
« Réponse #2 le: Mai 15, 2014, 10:33:15 am »
Je dessine un sprite.

Comme les Shape ne possèdaient pas de texture, je les dessine dans un rendertexture, puis au moyen d'un sprite, je les dessine sur une autre rendertexture en appliquant le shader.

Sinon oui, j'ai bien des erreurs sur la sortie standard si le code ne compile pas ou qu'il ne trouve pas le fichier :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : shader et paramètres
« Réponse #3 le: Mai 15, 2014, 11:06:21 am »
Citer
gl_TexCoord[0].xy + vec2(1.0,1.0)
Les coordonnées de texture étant toujours entre 0 et 1, ce code produira quoiqu'il arrive des coordonnées hors de la texture ;)
Laurent Gomila - SFML developer

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
Re : shader et paramètres
« Réponse #4 le: Mai 15, 2014, 11:09:48 am »
hohoooo,

alors la c'est vraiment très étrange, car je me suis inspiré d'une dizaine de sources qui utilisait ceci pour sélectionner un autre pixel... Je suis vraiment étonné^^

ok, la du coup j'ai un résultat, merci bcp!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : shader et paramètres
« Réponse #5 le: Mai 15, 2014, 11:26:56 am »
Quelles sources ?
Laurent Gomila - SFML developer

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
Re : shader et paramètres
« Réponse #6 le: Mai 15, 2014, 11:36:43 am »
google :D

dont par exemple: https://code.google.com/p/processing/source/browse/trunk/processing/java/libraries/opengl/examples/Shaders/FXAA/data/fxaa.glsl?r=9668

Du coup, comment puis-je obtenir la longueur d'un pixel?
comme ceci? + vec2(1,1) / gl_MaxTextureCoords

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : shader et paramètres
« Réponse #7 le: Mai 15, 2014, 11:53:22 am »
Citer
Du coup, comment puis-je obtenir la longueur d'un pixel?
Si longueur_texture = 1, alors 1 pixel = 1 / longueur_texture (pareil en Y avec largeur_texture).

Citer
dont par exemple: https://code.google.com/p/processing/source/browse/trunk/processing/java/libraries/opengl/examples/Shaders/FXAA/data/fxaa.glsl?r=9668

Moi je vois ça :

// The inverse of the texture dimensions along X and Y
uniform vec2 texcoordOffset;

...

vertTexcoord.xy + (vec2(-1.0, -1.0) * texcoordOffset)
Laurent Gomila - SFML developer

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
Re : shader et paramètres
« Réponse #8 le: Mai 15, 2014, 01:22:56 pm »
encore une chose que je ne comprends pas...

Pq dans le code il note ceci:

vec3 rgbNW = texture2D(sampler0, (gl_FragCoord.xy + vec2(-1.0,-1.0)) * inverse_resolution).xyz;

Si j'ai bien compris, gl_FragCoord.xy donne les coordonnées à l'écran. Le souci que j'ai avec ce shader, c'est que si je l'applique sur toute la fenetre, il fonctionne, mais si je l'applique uniquement sur une rendertexture, meme en adaptant les paramètres, il fait n'importe quoi

Voila le shader complet au cas ou (c 'est la meme que la réponse précédente en fait)
https://code.google.com/p/processing/source/browse/trunk/processing/java/libraries/opengl/examples/Shaders/FXAA/data/fxaa.glsl?r=9668

J'imagine que c'est une histoire de coordonnées, mais je ne vois pas vraiment ou^^
« Modifié: Mai 15, 2014, 03:33:43 pm par kryx »

kryx

  • Jr. Member
  • **
  • Messages: 67
    • Voir le profil
Re : shader et paramètres
« Réponse #9 le: Mai 15, 2014, 05:15:06 pm »
OK, j'ai trouvé le problème...

Voici mon shader corrigé:

#version 120
#define FXAA_REDUCE_MIN (1.0/128.0)
#define FXAA_REDUCE_MUL (1.0/8.0)
#define FXAA_SPAN_MAX 8.0
uniform sampler2D sampler0;
uniform vec2 resolution;

void main(){
   vec2 inverse_resolution=vec2(1.0/resolution.x,1.0/resolution.y);
   vec3 rgbNW = texture2D(sampler0, gl_TexCoord[0].xy + (vec2(-1.0,-1.0)) * inverse_resolution).xyz;
   vec3 rgbNE = texture2D(sampler0, gl_TexCoord[0].xy + (vec2(1.0,-1.0)) * inverse_resolution).xyz;
   vec3 rgbSW = texture2D(sampler0, gl_TexCoord[0].xy + (vec2(-1.0,1.0)) * inverse_resolution).xyz;
   vec3 rgbSE = texture2D(sampler0, gl_TexCoord[0].xy + (vec2(1.0,1.0)) * inverse_resolution).xyz;
   vec3 rgbM  = texture2D(sampler0,  gl_TexCoord[0].xy).xyz;
   vec3 luma = vec3(0.299, 0.587, 0.114);
   float lumaNW = dot(rgbNW, luma);
   float lumaNE = dot(rgbNE, luma);
   float lumaSW = dot(rgbSW, luma);
   float lumaSE = dot(rgbSE, luma);
   float lumaM  = dot(rgbM,  luma);
   float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
   float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
   vec2 dir;
   dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
   dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));
   float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL),FXAA_REDUCE_MIN);
   float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
   dir = min(vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),dir * rcpDirMin)) * inverse_resolution;
   vec3 rgbA = 0.5 * (texture2D(sampler0,   gl_TexCoord[0].xy   + dir * (1.0/3.0 - 0.5)).xyz + texture2D(sampler0,   gl_TexCoord[0].xy   + dir * (2.0/3.0 - 0.5)).xyz);
   vec3 rgbB = rgbA * 0.5 + 0.25 * (texture2D(sampler0,  gl_TexCoord[0].xy   + dir *  - 0.5).xyz + texture2D(sampler0,  gl_TexCoord[0].xy   + dir * 0.5).xyz);
   float lumaB = dot(rgbB, luma);
   if((lumaB < lumaMin) || (lumaB > lumaMax)) {
      gl_FragColor = vec4(rgbA,1.0);
   } else {
      gl_FragColor = vec4(rgbB,1.0);
   }
}