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] Flip en y d'une texture dans un fragment shader.


Sujet :

OpenGL

  1. #1
    Invité
    Invité(e)
    Par défaut [GLSL] Flip en y d'une texture dans un fragment shader.
    Salut, j'aimerais retourner une texture dans un fragment shader cependant j'ai un petit problème.

    Dans un 1er tant je passer les coordonnées de textures aux vertex shader que je multiplie par la matrice de texture pour avoir les coordonnées de texture max en x et en y comme ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    texCoords = gl_TextureMatrix[0] * vec4(float(intRect.x + intRect.z), float(intRect.y + intRect.w), 1, 1);

    intRect est le subRect de la texture SFML.
    texCoords est la variable de sortie que je passe au fragment shader, ainsi je n'ai plus qu'à faire maxY - gl_TextCoords[0].y dans le fragment shader.

    Mais je n'ai pas le résultat attendu, texCoords.x et texCoords.y valent toujours 0 et je ne comprend pas pourquoi.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vec4 pixel = texture2D(texture, vec2(gl_TexCoord[0].x, texCoords.y - gl_TexCoord[0].y));
    gl_FragColor = vec4(texCoords.x, texCoords.y, 0, 1);

    Vu que les pixels sont toujours noir..., si le subrect englobe toute la texture alors il suffit juste de faire 1 - gl_TexCoord[0].y et ça marche (la texture est retournée en y) mais dans le cas ou le subrect n'englobe pas toute la texture je ne vois pas très bien comment faire.

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai trouvé pourquoi ça me renvoyais toujours 0, 0 en fait j'avais mal passé les paramètres au shader

    Par contre pour les subrect qui n'englobent pas entièrement la texture ça ne fonctionne toujours pas j'ai un retournement en x plutôt que en y, bref, voici le code complet du fragment shader et du vertex shader :

    Code cpp : 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
     
    const std::string buildShadowMapVertexShader =
                        "#version 130 \n"
                        "out mat4 projMat;"
                        "uniform float sy;"
                        "uniform vec4 intRect;"
                        "uniform vec2 texSize;"
                        "out vec4 texCoords;"
                        "void main () {"
                            "vec4 tmpVert = vec4 (gl_Vertex.x, (gl_Vertex.y * sy), gl_Vertex.z, 1);"
                            "gl_Position = gl_ModelViewProjectionMatrix * tmpVert;"
                            "gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;"
                            "texCoords = gl_TextureMatrix[0] * vec4(intRect.x + intRect.z, intRect.y + intRect.w, 1, 1);"
                            "gl_FrontColor = gl_Color;"
                            "projMat = gl_ProjectionMatrix;"
                        "}";
    Le principe est simple, je veux récupérer le max des coordonnées de texture en y pour inverser l'ombre dans le fragment shader :

    Code cpp : 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
    17
    18
    19
    20
    21
    22
    23
    24
     
    const std::string buildShadowMapFragmentShader =
                        "#version 130 \n"
                        "uniform vec3 resolution;"
                        "uniform sampler2D stencilBuffer;"
                        "uniform sampler2D texture;"
                        "uniform float haveTexture;"
                        "uniform float set;"
                        "in mat4 projMat;"
                        "in vec4 texCoords;"
                        "void main() {"
                        "   vec2 position =  vec2 (gl_FragCoord.x / resolution.x, gl_FragCoord.y / resolution.y);"
                        "   vec4 stencil = texture2D(stencilBuffer, position);"
                        "   vec4 pixel = texture2D(texture, vec2(gl_TexCoord[0].x, texCoords.y - gl_TexCoord[0].y));"
                        "   vec4 color = (haveTexture == 1) ? pixel * gl_Color : gl_Color;"
                        "   float z = (gl_FragCoord.w != 1.f) ? (inverse(projMat) * vec4(0, 0, 0, gl_FragCoord.w)).w : gl_FragCoord.z;"
                        "   if (stencil.r == 0 || set == 0) {"
                        "       gl_FragColor = vec4(1, 0, 0, color.a);"
                        "   } else if (set == 1 && z >= stencil.z &&  color.a >= stencil.a) {"
                        "       gl_FragColor = vec4(1, 1, z, color.a);"
                        "   } else {"
                        "       gl_FragColor = stencil;"
                        "   }"
                        "}";

    Je ne vois pas bien comment faire avec les subRects. :/

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 883
    Points : 219 328
    Points
    219 328
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    Pourquoi ne pas retourner les coordonnées de texture directement dans le programme C(++) ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/12/2010, 19h35
  2. HLSL : appel d'une texture dans une texture procédurale
    Par StrangeAttractor dans le forum DirectX
    Réponses: 0
    Dernier message: 27/03/2010, 02h37
  3. Réponses: 2
    Dernier message: 01/03/2010, 13h46
  4. [GLSL]utiliser des textures dans un vertex shader
    Par delfare dans le forum OpenGL
    Réponses: 14
    Dernier message: 04/10/2007, 10h31
  5. Copier une texture dans une autre?
    Par supergrey dans le forum DirectX
    Réponses: 9
    Dernier message: 28/07/2004, 11h12

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