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 :

Quelque chose d'illogique se passe.


Sujet :

OpenGL

  1. #1
    Invité
    Invité(e)
    Par défaut Quelque chose d'illogique se passe.
    Bonjour, lorsque je croise deux sprites de couleurs semi-transparent, lorsque j'inverse l'ordre de dessin, la couleur obtenue au croisement n'est pas la même, pourtant, lorsque j'inverse les positions en z, la couleur au croisement reste la même.
    Sachant que je dessine le tout sur une texture de rendu en appliquant le "blending alpha" dans le fragment shader grâce à une formule logique de par le code suivant qui fonctionne très bien et en ayant prit soin de désactiver le blending par défaut d'opengl. (Pas besoin de chercher à optimiser pour un rendu dynamique car de toute façon même avec un algorithme de regroupement en temps réel le nombre d'image par seconde ne change pas, cela a été testé.)

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
                    const std::string depthGenFragShader =
                    "#version 130 \n"
                    "uniform sampler2D depthBuffer;"
                    "uniform sampler2D texture;"
                    "uniform vec3 resolution;"
                    "uniform float haveTexture;"
                    "in mat4 projMat;"
                    "void main () {"
                        "vec2 position = ( gl_FragCoord.xy / resolution.xy );"
                        "vec4 previous_depth_alpha = texture2D(depthBuffer, position);"
                        "vec4 texel = texture2D(texture, gl_TexCoord[0].xy);"
                        "vec4 colors[2];"
                        "colors[1] = texel * gl_Color;"
                        "colors[0] = gl_Color;"
                        "bool b = (haveTexture == 1);"
                        "float current_alpha = colors[int(b)].a;"
                        "float current_depth = (gl_FragCoord.w != 1.f) ? (inverse(projMat) * vec4(0, 0, 0, gl_FragCoord.w)).w : gl_FragCoord.z;"
                        "colors[1] = vec4(current_depth, current_alpha, current_depth, current_alpha);"
                        "colors[0] = vec4(current_depth, current_alpha, previous_depth_alpha.z, previous_depth_alpha.a);"
                        "b = (current_depth >= previous_depth_alpha.z && current_alpha != 0);"
                        "gl_FragColor = colors[int(b)];"
                    "}";
                    const std::string frameBufferGenFragShader =
                    "#version 130 \n"
                    "uniform sampler2D depthBuffer;"
                    "uniform sampler2D frameBuffer;"
                    "uniform sampler2D texture;"
                    "uniform vec3 resolution;"
                    "uniform float haveTexture;"
                    "in mat4 projMat;"
                    "void main () {"
                        "vec2 position = ( gl_FragCoord.xy / resolution.xy );"
                        "vec4 previous_depth_alpha = texture2D(depthBuffer, position);"
                        "vec4 previous_color = texture2D(frameBuffer, position);"
                        "vec4 texel = texture2D(texture, gl_TexCoord[0].xy);"
                        "vec4 colors[2];"
                        "colors[1] = texel * gl_Color;"
                        "colors[0] = gl_Color;"
                        "bool b = (haveTexture == 1);"
                        "vec4 current_color = colors[int(b)];"
                        "float current_depth = (gl_FragCoord.w != 1.f) ? (inverse(projMat) * vec4(0, 0, 0, gl_FragCoord.w)).w : gl_FragCoord.z;"
                        "colors[1] = current_color * current_color.a + previous_color * (1 - current_color.a);"
                        "colors[1].a = current_color.a + previous_color.a * (1 - current_color.a);"
                        "colors[0] = previous_color * previous_depth_alpha.a + current_color * (1 - previous_depth_alpha.a);"
                        "colors[0].a = previous_color.a + current_color.a * (1 - previous_color.a);"
                        "b = (current_depth >= previous_depth_alpha.z);"
                        "gl_FragColor = colors[int(b)];"
                    "}";
    Je ne vois pas en quoi l'ordre de dessin devrait changer la couleur de croisement des sprites, pour moi, ça n'a aucun sens.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    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 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pouvez-vous envoyer les captures d'écran pour montrer les deux cas, s'il vous plait.
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok, je ferais ça dès que j'ai le temps car je suis débordé en ce moment.

    Pour info je travaille avec MESA-drivers sur une plateforme ubuntu 14.04 64 bits LTS.

Discussions similaires

  1. Oh mince ! Quelque chose s'est mal passé.
    Par FoX_*D i E* dans le forum Debian
    Réponses: 3
    Dernier message: 29/10/2013, 18h06
  2. Je passe à côté de quelque chose ou quoi ?
    Par Aéris22 dans le forum Visual Studio
    Réponses: 22
    Dernier message: 07/11/2011, 12h15
  3. Bug ? Ou quelque chose s'est passé sur mon ordi ?
    Par souviron34 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 06/09/2007, 16h36
  4. [IA - MINMAX] Quelque chose d'illogique
    Par Bleys dans le forum Delphi
    Réponses: 3
    Dernier message: 21/04/2007, 00h16

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