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 :

Framebuffer et shaders


Sujet :

OpenGL

  1. #1
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Par défaut Framebuffer et shaders
    Bonjour,

    Je n'ai pas beaucoup d'expérience avec les shaders. Je pensais avoir un problème assez courant, mais je n'ai rien trouvé qui me sauve la vie en cherchant sur le forum.

    Ce qui marche:
    J'ai 2 passes:
    1/ Je dessine un cube dans une texture, implémenté en FBO
    2/ Je dessine un quad texturé par le FBO.

    J'ajoute un shader pour tracer le quad de la seconde passe. Dans mon Fragment Shader je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl_FragColor=vec4(1.0, 0.0, 0.0, 1.0);
    Alors mon quad est tout rouge. Ok.

    Mon problème:
    Je voudrais accéder à mon FBO pour reproduire le comportement par défaut du rendu du quad texturé. Voici le code source de mon Vertex Shader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    varying vec2 v_TexCoord;
     
    void main()
    {
    	gl_Position = ftransform();
      v_TexCoord = gl_MultiTexCoord0.st;
    }
    Et celui de mon Fragment Shader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uniform sampler2D u_TextureImage;
    varying vec2 v_TexCoord;
     
    void main()
    {
        gl_FragColor = texture2D(u_TextureImage, v_TexCoord);
    }
    Après la creation du shader, je définis la variable uniforme "u_TextureImage" à 0.

    Je prends un GL_INVALID_OPERATION au passage dans le shader. Il y a un truc qui m'échappe, mais je tourne en rond et je n'arrive pas à trouver quoi.

    Merci de votre aide...

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On peut voir le code correspondant au bind de la texture ?

    Au fait, pas besoin de définir une variable pour transmettre les coordonnées de texture, tu as déjà gl_TexCoord[0] pour ça.

  3. #3
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Par défaut
    Ok, ça va être un peu plus conséquent, alors, mais je vais détailler un peu plus.

    Je crée le FBO de la manière suivante (cd->target vaut GL_TEXTURE_2D):
    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
     
    // Creating objects
    glGenTextures( 1, &(cd->color_buffer) );
    glGenRenderbuffersEXT( 1, &(cd->depth_buffer) );
    glGenFramebuffersEXT( 1, &(cd->frame_buffer) );
     
    // Binding objects
    glBindTexture( cd->target, cd->color_buffer );
    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, cd->depth_buffer );
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, cd->frame_buffer );
     
    // Initialization of the texture
    glTexParameteri( cd->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( cd->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( cd->target, GL_TEXTURE_WRAP_S, GL_CLAMP );
    glTexParameteri( cd->target, GL_TEXTURE_WRAP_T, GL_CLAMP );
    glTexImage2D( cd->target, 0, GL_RGBA, cd->wtex, cd->htex, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
     
    // Initialize the Depth Render Buffer
    glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, cd->wtex, cd->htex);
     
    // Attach texture to FrameBuffer
    glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, cd->target, cd->color_buffer, 0 );
     
    // Attach the Render Buffer to the Frame Buffer
    glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, cd->depth_buffer );
     
    // Checking the status
    assert( GL_FRAMEBUFFER_COMPLETE_EXT==glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) );
     
    // Unbinding
    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
    glBindTexture( cd->target, 0 );
    Ensuite, je dessine ma scene dans mon FBO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    glBindTexture( cd->target, cd->color_buffer );
    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, cd->depth_buffer );
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, cd->frame_buffer );
    // Checking the status
    assert( GL_FRAMEBUFFER_COMPLETE_EXT==glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) );
     
    // Dessin de la scene
    dessine_scene (c, data);
     
    // Unbinding
    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
    glBindTexture( cd->target, 0 );
    Enfin, je bind ma texture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glEnable (cd->target);
    glBindTexture (cd->target, cd->color_buffer);
    Et j'enable mon shader et je dessine ma géométrie.

  4. #4
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Par défaut
    Fausse alerte. J'essayais d'attribuer ma texture (uniforme) entre le glCreateProgram et le glUseProgram.

    Désolé pour le dérangement.

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

Discussions similaires

  1. Shader distortion texture
    Par Dranor dans le forum DirectX
    Réponses: 13
    Dernier message: 28/07/2004, 21h58
  2. effets de pixel shaders 1.1
    Par cemoi dans le forum DirectX
    Réponses: 11
    Dernier message: 12/12/2003, 15h13
  3. pixel shader 2.0
    Par trois_1 dans le forum DirectX
    Réponses: 3
    Dernier message: 20/10/2003, 15h39
  4. Vertex et Pixel Shader
    Par Riko dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/06/2003, 16h45
  5. carte graphique et pixels shader
    Par yeeep dans le forum DirectX
    Réponses: 2
    Dernier message: 26/04/2003, 10h54

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