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 :

Problème FBO rendu multi textures offscreen


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Problème FBO rendu multi textures offscreen
    Bonjour !

    Tout d'abord : Merci pour ce forum et vos réponses, je me suis déjà sorti de pas mal de problèmes grâce à vous.

    Mais, il en reste xD

    Pour résumer un peu, je code actuellement des shaders d'ombrage pour du rendu real-time, mais j'ai besoin des infos sur les pixels voisins donc je voudrais récupérer ces données avec un rendu offscreen via un FBO.

    J'ai suivi plusieurs exemples/tutos dispos sur le net, et je ne vois pas où ça cloche sachant que mes deux tests sur le FBO (voir code) me donnent
    "Error : Aucune erreur" et
    "Unknown error while attempting to create frame buffer object!"
    donc je sais pas trop...


    voici mes diverses fonctions :


    Rendu propre au Mesh :
    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
    void MeshObj::draw_model(bool nor,bool tex)
    {
        glEnableClientState(GL_VERTEX_ARRAY);
        if(nor)
            glEnableClientState(GL_NORMAL_ARRAY);
        if(tex)
        {
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
            glBindTexture(GL_TEXTURE_2D,texture);
        }
        glEnableClientState(GL_COLOR_ARRAY);
     
        glVertexPointer(3,GL_FLOAT,0,vertice);
     
        if(tex)
            glTexCoordPointer(2,GL_FLOAT,0,textures);
        if(nor)
            glNormalPointer(GL_FLOAT,0,normals);
        glColorPointer(4,GL_FLOAT,0,colours);
     
        glDrawArrays(GL_QUADS,0,n_data);
     
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    Création des textures et du 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
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    unsigned int W_fen = 1024;  // largeur fenetre
    unsigned int H_fen = 1024;  // hauteur fenetre
     
    GLuint				createRectTex(){
     
    	//GLuint type = GL_TEXTURE_RECTANGLE_ARB;
    	GLuint type = GL_TEXTURE_2D;
    	GLuint tex_handle;
    	glGenTextures (1, &tex_handle);
    	glBindTexture(type,tex_handle);
     
    	// set texture parameters
    	glTexParameteri(type, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    	glTexParameteri(type, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    	glTexParameteri(type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    	glTexParameteri(type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     
    	glTexImage2D(type,0,GL_RGBA8,W_fen,H_fen,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
    	glBindTexture(type,0);	
     
    	return tex_handle;
    }
     
    void				initFBO(){
    	//create FBO
    	glGenFramebuffersEXT(1,&pp_FBOPreProc);
    	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pp_FBOPreProc);
     
    	//Create & init DepthBuffer
    	glGenRenderbuffersEXT(1, &buff_depth);
    	glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, buff_depth);
    	glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, W_fen, H_fen);
     
    	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, buff_depth);
    	//Create & link textures
    	t_position = createRectTex();
    	t_normal = createRectTex();
    	t_col = createRectTex();
     
    	//GLuint type = GL_TEXTURE_RECTANGLE_ARB;
    	GLuint type = GL_TEXTURE_2D;
     
    	glBindTexture(type,t_col);
    	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,type, t_col, 0);
    	glBindTexture(type,t_position);
    	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,type, t_position, 0);
    	glBindTexture(type,t_normal);
    	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,type, t_normal, 0);
     
    	GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
     
    	fprintf(stderr, "Error: %s\n", gluErrorString(status));
     
    	switch(status) {
    		case GL_FRAMEBUFFER_COMPLETE:
    			return;
    			break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
    		cout<<"An attachment could not be bound to frame buffer object!"<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
    		cout<<"Attachments are missing! At least one image (texture) must be bound to the frame buffer object!"<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
    		cout<<"The dimensions of the buffers attached to the currently used frame buffer object do not match!"<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
    		cout<<"The formats of the currently used frame buffer object are not supported or do not fit together!"<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
    		cout<<"A Draw buffer is incomplete or undefinied. All draw buffers must specify attachment points that have images attached."<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
    		cout<<"A Read buffer is incomplete or undefinied. All read buffers must specify attachment points that have images attached."<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
    		cout<<"All images must have the same number of multisample samples."<<endl;
    		break;
     
    	case GL_FRAMEBUFFER_UNSUPPORTED:
    		cout<<"Attempt to use an unsupported format combinaton!"<<endl;
    		break;
     
    	default:
    		cout<<"Unknown error while attempting to create frame buffer object!"<<endl;
    		break;
    	}
     
    	//Unload preproc buffers
    	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    	glBindTexture(type,0);
    }

    Shaders :

    (La Color me permet de faire passer des données, ici "l'aire" de sommet (1/3 de l'aire des faces adjacentes)

    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
     
    Vert :
     
    varying vec4 v_position;
    varying vec3 v_normal;
    varying float v_area;
     
     
    void main(){
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    	gl_FrontColor = gl_Color;
    	v_position = gl_Vertex;
    	v_normal = gl_Normal;
    	v_area = gl_Color.r;
    }
     
    Frag :
     
    varying vec4 v_position;
    varying vec3 v_normal;
    varying float v_area;
     
    void main(void)
    {
            gl_FragData[0] = vec4(gl_Color.r, gl_Color.g,gl_Color.b,1.0);
            gl_FragData[1] = v_position;
    		gl_FragData[2] = vec4(v_normal,v_area);
    }
    Et enfin ma fonction d'affichage :

    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
    void dessiner( )
    {
     
    	glBindTexture(GL_TEXTURE_2D, 0);
    	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pp_FBOPreProc);
    	glViewport(0,0,W_fen, H_fen);
     
    	GLenum dbuffers[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT};
    	glDrawBuffers(3, dbuffers);
    	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
     
    	GLuint	AOV,AOP,AOF;
    	//Load the pre-processing shaders
    	AOV = LoadShader(GL_VERTEX_SHADER,"RtoT.vert");
    	AOF = LoadShader(GL_FRAGMENT_SHADER,"RtoT.frag");
    	AOP = LoadProgram(AOV,AOF);
    	glUseProgram(AOP);
     
    	MyMesh.draw_model(true, false);
     
    	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    	glUseProgram(0);
    	glDeleteShader(AOV);
    	glDeleteShader(AOF);
    	glDeleteProgram(AOP);
     
    	glBindTexture(GL_TEXTURE_2D, t_col);
    	glBegin(GL_QUADS);
        glTexCoord2d(0.f,1.f);		glVertex3d(1.f,1.f,1.f);
        glTexCoord2d(0.f,0.f);		glVertex3d(1.f,1.f,-1.f);
        glTexCoord2d(1.f,0.f);		glVertex3d(-1.f,1.f,-1.f);
        glTexCoord2d(1.f,1.f);		glVertex3d(-1.f,1.f,1.f);
        glEnd();
    	glBindTexture(GL_TEXTURE_2D, 0);
     
     
     
    }
    Qui devrait me rendre un carré avec ma texture contenant mon rendu offscreen, mais qui me dessine mon mesh normal plus un carré blanc...

    Je vois pas du tout d'où ça pourrait venir...

    Il est possible que ce soit une erreur de débutant, j'ai fait pas mal de C++ avant mais je commence seulement le GLSL/opengl.

    Infos techniques : XPpro, Nvidia gtx 470, Visual studio 10

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


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

    Pour les erreurs, je crois que la méthode de détection est assez bancales.
    Je conseille donc d'afficher le code d'erreur et d'en vérifié l'équivalence en regardant dans gl.h ou glext.h
    Ainsi, il n'y aura aucun doute :p

    Le carré blanc == texture non valide ... mais en même temps, lorsque l'on se trouve dans un cas d'erreur :p
    Sinon, l'erreur viendra très certainement d'une paramètre faux (j'attends d'avoir votre code d'erreur précis, pour faire plus de recherche)

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Salut !

    Alors après de multiples test d'affichage d'erreur et d'exploration des locals dans visual studio en mettant en pause l'éxecution, j'ai bien l'impression que mon :

    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);

    est toujours à 0.

    Sinon j'utilise Glee, il y a peut être quelques trucs à activer via GLeeEnabled non ?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 921
    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 921
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    Citation Envoyé par Cytior Voir le message
    Salut !

    Alors après de multiples test d'affichage d'erreur et d'exploration des locals dans visual studio en mettant en pause l'éxecution, j'ai bien l'impression que mon :

    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);

    est toujours à 0.

    Sinon j'utilise Glee, il y a peut être quelques trucs à activer via GLeeEnabled non ?
    Ah ... bah je viens de remarquer que votre switch sur l'erreur, ne prenez pas en compte GL_NO_ERROR ... du coup il affiche un message alors qu'il n'y a pas d'erreur.
    Sinon, cela n'explique pas le probleme pour autant

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    En effet ^^

    Est-ce que le problème pourrait venir du fait que je dessine avec un DrawArrays ?

    Sinon j'ai effectué un nouveau test dans ma boucle d'affichage avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GLenum error = glGetError();
    if ( error != GL_NO_ERROR )
    printf("Attention erreur : %d\n",error);
    Et je récupère la valeur 1282 dans error qui semble vouloir dire invalid Operation...

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Hop j'ai avancé (un peu)

    Il ne faut pas oublier de nettoyer le ColorBuffer etc... entre la passe de render to texture et celle de d'affichage avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Bon, jça ne règle pas mon problème de FBO/RtoT, mais au moins, ça n'apparait plus.

    Reste à bien rendre dans les textures

  7. #7
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Tu as essayé de *vraiment* écrire dans les textures avant de les utiliser comme cible pour un FBO (i.e. sans NULL)?

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    tu as raison le problème semble venir des textures.

    J'ai fais quelques tests et apparemment glGenTexture() me renvoie toujours 0 dans un cas, ou toujours 3435973836 dans un autre...

    Je viens de trouver cette erreur, donc je vais un peu chercher sur le web pour voir d'où ça peut venir.


    EDIT : WOOT !!! c'était ça -_- En fait je créait mes textures sans avoir de contexte GL en route, donc ça ne marchait pas... J'ai simplement déplacé l'appel de ma fonction init et hop !

    Donc j'arrive en effet à rendre dans des textures, reste à faire marcher mon shader maintenant !

    EDIT2 : Bon, je n'arrive pas à rendre dans plusieurs textures des trucs différents (via fragData), j'ai le même contenu dans mes trois GL_COLOR_ATTACHMENT*_EXT

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bon, tout est résolu !

    Mon problème ne venait pas de mes données mais de la façon dont j'essayais de les afficher pour le test, il faut donc faire attention à où on met le glGenerateMipmapEXT si on ne veut pas avoir des résultats absurdes.

    Merci vos les idées et indications ! (on met comment en résolu ?)

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 921
    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 921
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    Citation Envoyé par Cytior Voir le message
    Merci vos les idées et indications ! (on met comment en résolu ?)
    Il y a un bouton en haut et en bas de la page je crois (pour vous du moins )

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci o/

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

Discussions similaires

  1. Problème de multi textures
    Par Moldix dans le forum OpenGL
    Réponses: 2
    Dernier message: 03/01/2014, 05h45
  2. Problème étrange - shader multi texturing
    Par Awakening dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/12/2011, 19h08
  3. Problème de rendu multi entités (Ogre & Qt )
    Par Meledith dans le forum Ogre
    Réponses: 1
    Dernier message: 30/03/2010, 15h22
  4. [libjpeg && opengl] problème "multi-texturing"
    Par pspflashsystem dans le forum OpenGL
    Réponses: 4
    Dernier message: 23/02/2009, 14h01
  5. Problème de requete multis-selections
    Par tripper.dim dans le forum SQL
    Réponses: 9
    Dernier message: 03/09/2003, 14h08

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