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 :

Render to Texture / couche alpha


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut Render to Texture / couche alpha
    Bonjour à tous,
    je suis confronté à un problème concernant le rendu dans une texture et la gestion de sa couche alpha. J'utilise la méthode classique de dessin sur le framebuffer avec copie dans la texture via glCopyTexSubImage2D (utilisation des FBOs en cours d'implémentation). Pour tester/afficher la texture (composé d'un triangle simple), je dessine ensuite un quad occupant tout mon viewport, à l'aide d'un pixelshader (utilisation de la librairie CG, simple remplacement pixel à pixel) Tout fonctionne bien jusque là.
    Or j'aimerais utiliser la composante alpha de ma texture pour pouvoir empiler plusieurs render to texture les uns sur les autres. Pour tester la couche alpha, je remplace dans mon shader le dessin du pixel (rgba) par le dessin de ce pixel (aaaa) pour pouvoir "voir" ma couche alpha. C'est là que ça se gate car j'obtiens à tous les coups une image blanche ...
    J'aimerais dans un premier temps simplement dessiner cette couche alpha (en vue ensuite de pouvoir réaliser des opérations (alpha blending par exemple))

    Merci pour votre aide !

    Voici le code utilisé :

    Initialisation de la texture (qui va contenir le rendu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    glGenTextures(1,&m_glName);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT );
    // m_width = m_height = 512
    // pMyPictureData pointe sur un tableau d'octets (de valeur nulle)           
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,m_width,m_height,0,GL_RGBA,GL_UNSIGNED_BYTE,pMyPictureData);
    ...
    Dessin dans cette texture
    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
     
    // le taille de la fenêtre est de 800x600
    // m_width = m_height = 512
    glViewport(0,0,m_width,m_height);
    glScissor(0,0,m_width,m_height);
     
     
    // Dessin d'un triangle 2D occupant la moitié du viewport
    // Fond jaune avec alpha à 0.0f
    glClearColor(1.0f,1.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    // Projection / Modelview
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    ...
    // Dessin du triangle
    // Je suppose qu'à ce niveau là, les pixels occupés par le triangle ont une 
    // composante alpha qui vaut 1, le reste valant 0.
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);glVertex2f(-0.5f,-0.5f);
    glColor3f(0.0f,1.0f,0.0f);glVertex2f(-0.5f,0.5f);
    glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.5f,0.5f);
    glEnd();
     
    // Upload vers la texture
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textureId);
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
    glDisable(GL_TEXTURE_2D);
    Dessin du quad sur le viewport entier
    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
    50
     
    glViewport(0,0,800, 600);
    glScissor(0,0,800, 600);
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
     
    // Draw quad on main viewport
    glTranslatef(-1.0f,-1.0f,0.0f);
    glScalef(2.0f,2.0f,0.0f);
     
     
     
    // Code cg encapsulé
    // Dans le code d'init : 
    // m_cgLayerTextureId = cgGetNamedParameter(mp_pixelShader->m_program, "layerTexture");
     
    cgGLSetTextureParameter (m_cgLayerTextureId,textureId);
    cgGLEnableTextureParameter(m_cgLayerTextureId);
    mp_pixelShader->M_bind();
     
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f,0.0f);glVertex2f(0.0f,  0.0f);
    glTexCoord2f(0.0f,1.0f);glVertex2f(0.0f,  1.0f);
    glTexCoord2f(1.0f,1.0f);glVertex2f(1.0f,  1.0f);
    glTexCoord2f(1.0f,0.0f);glVertex2f(1.0f,  0.0f);
    glEnd();
     
    // Code cg encapsulé
    mp_pixelShader->M_unBind();
    cgGLDisableTextureParameter(m_cgLayerTextureId);
     
    //Shader
    void main
    ( 
    in        float4        inColor:        COLOR,
    in         float4         position :         POSITION,
    in         float2         texcoord0 :     TEXCOORD0,
    uniform in        sampler2D     layerTexture,
    out        float4        outColor:        COLOR
    )
     
    {
        float4 texColor = tex2D( layerTexture, texcoord0 );
        outColor.xyz = texColor.www; // dessin de la couche alpha
    }

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    juste une question bête : tu a bien verifier que le buffer de rendu contient une composante alpha (qui s'active au moment de la creation du context openGL) ?
    a part ca, si c'est sur carte ATI, j'ai entendu parler d'un problème comme ca une fois, mais c'etait avec des FBO...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Mon contexte OpenGL est bien initialisé avec une profondeur de 32 bits au format RGBA... Ma carte graphique est une GeForce FX Go 5600 (laptop Sony Vaio).
    Je me disais : n'y aurait-il pas à faire un glEnable(GL_BLEND) au moment du rendu du quad final ? Même si cela me parait être redondant avec l'utilisation d'un shader ...

  4. #4
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    oui et non
    en fait ca depend de comment marche ton systeme.
    si tout est rendu dans des buffer offscreen , tu peut tres bien tout faire en shader, par contre, si tu ne fait qu'ecrire dans le color buffer, alors la oui, il faut activer le blending.
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Tel que cela se passe pour le moment (sans FBOs), tout est rendu dans le color buffer (celui de la fenêtre) :

    1. Dessin dans un viewport (RGBA) de 512x512 (taille de la texture)
    2. Upload vers la texture (T) (RGBA) avec glCopyTexSubImage2D
    3. Dessin d'un quad avec texture (T) sur le viewport en 800x600. Utilisation du shader (outColor.xyz = texColor.www) pour dessiner la couche alpha/masque.

    Quelque part il faudrait que j'active le blending ? (entre 2. et 3.)

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    le blending est une opération entre une source et une destination, je doute que cela change quelque chose mais dans le doute, essayes toujours

    sinon, regardes du côté de glPixelTransferf et vérifie que GL_ALPHA_SCALE n'est pas à 0

    si tu forces une valeur dans ton shader (essayes 0, 0.5, 1 par exemples) le résultat en sortie change ? si ce n'est pas le cas c'est un problème différent
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par julien_v3ga
    Tel que cela se passe pour le moment (sans FBOs), tout est rendu dans le color buffer (celui de la fenêtre) :

    1. Dessin dans un viewport (RGBA) de 512x512 (taille de la texture)
    2. Upload vers la texture (T) (RGBA) avec glCopyTexSubImage2D
    3. Dessin d'un quad avec texture (T) sur le viewport en 800x600. Utilisation du shader (outColor.xyz = texColor.www) pour dessiner la couche alpha/masque.

    Quelque part il faudrait que j'active le blending ? (entre 2. et 3.)
    oui, ici, typiquement, il faut activer le blending.

    en fait, les fragment program/shaders ne permettent pas de lire dans le color buffer, mais seulement d'y ecrire. Donc si tu veut faire des effets qui utilisent les donnée contenu dans le color buffer, il faut du blending
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Merci pour les réponses !
    Je vais creuser dans cette direction (blending).

    si tu forces une valeur dans ton shader (essayes 0, 0.5, 1 par exemples) le résultat en sortie change ? si ce n'est pas le cas c'est un problème différent
    Dans le shader, outColor.xyz = texColor.xyz marche bien, je me retrouve avec la texture dessinée sur l'écran entier.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    J'ai résolu le problème :

    - problème d'initialisation du contexte OpenGL Lors de sa création, le ChoosePixelFormat() était bien appelé avec un pixelformatdescriptor.iPixelType = PFD_TYPE_RGBA. Cependant, je ne positionnais pas explicitement ses données cRedBits, cGreenBits, cBlueBits, cAlphaBits. Ainsi par défaut, ChoosePixelFormat() me choississait une config de [r=8,g=8,b=8,a=0] pour le color buffer! Chaque rendu perdait donc les infos de la couche alpha ...

    Merci pour votre aide.

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

Discussions similaires

  1. comment manipuler la couche alpha d'un .png
    Par bilel dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/07/2005, 14h40
  2. couche alpha avec directdraw
    Par pepedimancho dans le forum DirectX
    Réponses: 4
    Dernier message: 14/06/2005, 18h11
  3. Comment afficher un Bitmap contenant une couche alpha ?
    Par pwozniak dans le forum Composants VCL
    Réponses: 9
    Dernier message: 17/01/2005, 19h55
  4. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20
  5. Render to texture???
    Par sebh dans le forum OpenGL
    Réponses: 2
    Dernier message: 17/01/2004, 09h50

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