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 :

Depth buffer dans texutre ( opengl )


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut ombre avec fbo ( opengl )
    Bonjour,

    pour développer un shader pour gérer les ombres, j'ai besoin de récupérer dans une texture les valeurs du depth buffer avec la caméra remplaçante la lumière..
    Mes premières recherches m'ont permis de découvrir que je devait utiliser :

    glGenTextures(1, &shadowMapTexture);
    glBindTexture(GL_TEXTURE_2D, shadowMapTexture);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadowMapSize, shadowMapSize, 0,
    GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
    mais pour la suite je galère un peu^^
    si qqun peux m'aider, au moins une piste... merci bieng

  2. #2
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    le code que j'ai utilisé pour la création du fbo utilisé pour le rendu est ici:
    http://www.developpez.net/forums/sho...d.php?t=506290

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    bonjour,
    ton code est en effet interessant mais j'ai des problèmes à l'exécution pour : glGenFramebuffersEXT(1, &fbo);, il me sort un access violation.
    Fbo est bien défini... une idée?

  4. #4
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Si c'est vraiment au niveau de glGenFrameBuffers c'est que tu as surement un problème avec ta gestion d'extensions.

    Personellement j'utlise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define GL_GLEXT_PROTOTYPES    1
    #include <GL/glext.h>
    qui pour l'instant gère très bien tout ça.

    Si tu définis à la main les adresses des extensions, c'est plus risqué

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    j'ai récupéré glext.h et l'ai inclu à mon projet mais le problème persiste

    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
    	glutInit(&argc,argv);
     
    	glutInitWindowPosition(POS_X_ECRAN,POS_Y_ECRAN);
    	glutInitWindowSize(LARGEUR_FENETRE,HAUTEUR_FENETRE);
    	glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
     
    	glutCreateWindow("Shadow");
     
    	glEnable(GL_LINE_SMOOTH);
    	glEnable(GL_DEPTH_TEST);
     
    	glutDisplayFunc(affichage);
    	glutReshapeFunc(redimensionnement);
    	glutKeyboardFunc(clavier);
    	glutSpecialFunc(special);
    	glutMouseFunc(souris);
     
    	glGenFramebuffersEXT(1, &fbo); // <- ICI
        glGenTextures(1, &depth_texture);
        glBindTexture(GL_TEXTURE_2D, depth_texture);

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Décidemment, je galère pas mal avec les FBOs. J'ai l'impression de bien faire, masi ça ne fonctionne pas. Dans mon topic je souhaite afficher la scène dans un buffer auxiliaire de couleur. Ca fonctionne à part le problème du glClear. Mais pour dessiner le contenu d'une texture de profondeur, impossible, j'ai soit un écran blanc soit un écran noir, suivant les réglages :/.

    Initialisation :

    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
    void InitOGL ()
    {
    	glewInit ();
     
    	// Set color and depth clear value
       glClearDepth(1.f);
       glClearColor(0.f, 0.f, 0.3f, 1.f);
     
       // Enable Z-buffer read and write
       glEnable(GL_DEPTH_TEST);
       glDepthMask(GL_TRUE);
     
       // Setup a perspective projection
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
     
    	glViewport (0, 0, 512, 512); // On règle le Viewport
     
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluPerspective (60.0, 512.0 / 512.0, 1.0, 20.0);
     
       glMatrixMode (GL_MODELVIEW);
       glLoadIdentity (); // On rétablit la matrice identité
     
    	// Création du quadric
    	sphere = gluNewQuadric ();
     
    	glGenFramebuffersEXT(1, &framebuffer);
       glGenTextures(1, &texture1);
       glBindTexture(GL_TEXTURE_2D, texture1);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
     
       glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 512, 512, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
       glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, texture1, 0);
       glDrawBuffer(GL_NONE);
       glReadBuffer(GL_NONE);
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    }
    Rendu de la scène :

    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
    void Render ()
    {
    	gluLookAt (0.0f, 0.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    	glRotatef (20.0f, 1.0f, 0.0f, 0.0f);
     
    	// On rend la scène dans le framebuffer
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);
         RenderScene(); 
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
     
    	// Puis on dessine la texture
    	glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, texture1);
    		DrawQuad ();
    	glBindTexture (GL_TEXTURE_2D, 0);
    	glDisable (GL_TEXTURE_2D);
    }
    Les FBOs sont vraiment très bien faits, bien conçus. Par contre ils sont vraiment galère à bien prendre en main :/.

  7. #7
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Même topo que sur l'autre post, vérifie que ton FBO est bien complet.
    Celui çi doit être bon vu que tu désactives l'écriture dans le color buffer avec tes glDrawBuffer / glReadBuffer.

    Mais là tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
    qui active la comparaison du z du fragment avec le r de ta texture.
    En gros, pour chaque pixel de ton quad, ça va comparer le z du pixel avec celui correspondant dans la depth map, renvoyer comme couleur 1. ( donc blanc ) si le test passe, 0. ( donc noir ) sinon.

    Bref, si tu veux visualiser la depth map en tant que texture, un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
    avant l'affichage et la magie devrait opérer

  8. #8
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Pour Rastacouéne je ne vois pas trop ce qui pourrait poser problème ...
    Es tu sur que ta carte graphique supporte l extension des FBOs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        char * extensionList = (char *) glGetString(GL_EXTENSIONS);
        sdt::cout << extensionList << std::endl;
    t'affichera la liste des extensions supportées, si tu ne vois pas celle des FBO tu l'as dans l'os

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Merci Harold de ton aide. Mais ça ne fonctionne pas. J'ai changé glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE) par glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE) comme tu me l'as suggéré lors de la création de la texture.

    Mais rien n'y fait, j'ai toujours un écran blanc (ou noir, suivant où j'ajoute le glClear). :

    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
    void Render ()
    {
    	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity ();
     
    	gluLookAt (0.0f, 0.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    	glRotatef (20.0f, 1.0f, 0.0f, 0.0f);
     
    	// On rend la scène dans le framebuffer
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);
         RenderScene();
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
     
    	// Puis on dessine la texture
    	glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, texture1);
    		DrawQuad ();
    	glBindTexture (GL_TEXTURE_2D, 0);
    	glDisable (GL_TEXTURE_2D);
    }
    J'en suis sûr que c'est un appel qui est mal placé, j'ai l'impression que les FBOs sont très exigeants, un appels placé avant un autre pouvant tout foutre en l'air. Ce serait possible que tu testes de chez toi ? La fonction de rendu est là, et la fonction d'initialisation est le même si ce n'est le GL_COMPARE que j'ai mis à NONE comme tu me l'as dit.

  10. #10
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Peux tu copier coller le code de ton renderScene et drawQuad stp ?

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Bien sûr :

    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
     
    void RenderScene ()
    {
    	// On dessine un sol
    	glBegin (GL_QUADS);
    		glNormal3f (0.0f, 1.0f, 0.0f);
    		glVertex3f (-5.0f, 0.0f, 5.0f);
    		glVertex3f (-5.0f, 0.0f, -5.0f);
    		glVertex3f (5.0f, 0.0f, -5.0f);
    		glVertex3f (5.0f, 0.0f, 5.0f);
    	glEnd ();
     
    	// Et une sphère
    	glTranslatef (0.0f, 5.0f, 0.0f);
    	gluSphere (sphere, 2.0f, 20, 20);
    }
     
    void DrawQuad ()
    {
    	// On utilise une perception 2D
    	glMatrixMode (GL_PROJECTION);
    	glPushMatrix ();
    	glLoadIdentity ();
    	gluOrtho2D (0.0, 512.0, 0.0, 512.0);
     
    	glMatrixMode (GL_MODELVIEW);
    	glPushMatrix ();
    	glLoadIdentity ();
     
    	glColor3f (1.0f, 1.0f, 1.0f);
    	glBegin (GL_QUADS);
    		glTexCoord2f (0.0f, 0.0f);
    		glVertex2f (0.0f, 0.0f);
    		glTexCoord2f (1.0f, 0.0f);
    		glVertex2f (512.0f, 0.0f);
    		glTexCoord2f (1.0f, 1.0f);
    		glVertex2f (512.0f, 512.0f);
    		glTexCoord2f (0.0f, 1.0f);
    		glVertex2f (0.0f, 512.0f);
    	glEnd ();
     
    	glPopMatrix ();
     
    	glMatrixMode (GL_PROJECTION);
    	glPopMatrix ();
    }

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Citation Envoyé par Harooold Voir le message
    Pour Rastacouéne je ne vois pas trop ce qui pourrait poser problème ...
    Es tu sur que ta carte graphique supporte l extension des FBOs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        char * extensionList = (char *) glGetString(GL_EXTENSIONS);
        sdt::cout << extensionList << std::endl;
    t'affichera la liste des extensions supportées, si tu ne vois pas celle des FBO tu l'as dans l'os
    en effet voila ce que ça donne:
    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
    GL_ARB_color_buffer_float GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_fragme
    nt_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_half_flo
    at_pixel GL_ARB_imaging GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_
    query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_
    ARB_shadow GL_ARB_shader_objects GL_ARB_shading_language_100 GL_ARB_texture_bord
    er_clamp GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_a
    dd GL_ARB_texture_env_combine GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_AR
    B_texture_mirrored_repeat GL_ARB_texture_non_power_of_two GL_ARB_texture_rectang
    le GL_ARB_transpose_matrix GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_
    ARB_vertex_shader GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_texture_float GL_
    ATI_texture_mirror_once GL_S3_s3tc GL_EXT_texture_env_add GL_EXT_abgr GL_EXT_bgr
    a GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate G
    L_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_Cg_
    shader GL_EXT_depth_bounds_test GL_EXT_draw_range_elements GL_EXT_fog_coord GL_E
    XT_framebuffer_object GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EX
    T_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_rescal
    e_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_fun
    cs GL_EXT_stencil_two_side GL_EXT_stencil_wrap GL_EXT_texture3D GL_EXT_texture_c
    ompression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture
    _env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_te
    xture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_obj
    ect GL_EXT_texture_sRGB GL_EXT_timer_query GL_EXT_vertex_array GL_HP_occlusion_t
    est GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL
    _NV_blend_square GL_NV_copy_depth_to_color GL_NV_depth_clamp GL_NV_fence GL_NV_f
    loat_buffer GL_NV_fog_distance GL_NV_fragment_program GL_NV_fragment_program_opt
    ion GL_NV_fragment_program2 GL_NV_half_float GL_NV_light_max_exponent GL_NV_mult
    isample_filter_hint GL_NV_occlusion_query GL_NV_packed_depth_stencil GL_NV_pixel
    _data_range GL_NV_point_sprite GL_NV_primitive_restart GL_NV_register_combiners
    GL_NV_register_combiners2 GL_NV_texgen_reflection GL_NV_texture_compression_vtc
    GL_NV_texture_env_combine4 GL_NV_texture_expand_normal GL_NV_texture_rectangle G
    L_NV_texture_shader GL_NV_texture_shader2 GL_NV_texture_shader3 GL_NV_vertex_arr
    ay_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_NV_vertex_program1_1
    GL_NV_vertex_program2 GL_NV_vertex_program2_option GL_NV_vertex_program3 GL_NVX_
    conditional_render GL_SGIS_generate_mipmap GL_SGIS_texture_lod GL_SGIX_depth_tex
    ture GL_SGIX_shadow GL_SUN_slice_accum GL_WIN_swap_hint WGL_EXT_swap_control
    et je l'ai donc dans l'os >< pourtant une GeForce 7600

  13. #13
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Nonon il est bien là,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GL_EXT_framebuffer_object
    relis bien

  14. #14
    Membre éprouvé Avatar de Harooold
    Homme Profil pro
    Ingénieur 3D temps réel
    Inscrit en
    Mars 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2008
    Messages : 136
    Par défaut
    Pour Bakura,
    Je n'ai pas grand chose à redire sur le code ...
    Excepté que tu a un Zfar à 20 et que le z de ta caméra est 20
    Du coup si jamais tu vois ta sphère, ben tu n'en verras que la motié :p

    De plus, la texture de profondeur sera affichée en niveau de gris avec du noir pour z = Znear et blanc pour z = Zfar, le tout interpolé non linéairement.
    Or toi tes objets sont tout au fond, donc apparaitront presque blanc, ainsi que ta couleur d effacement, ça risque de ne pas vraiment se voir.

    Essaie de ramener ta camera plus près de tes objets, ça sera deja un peu mieux.
    Si tu ne vois toujours rien, je sèche :s

  15. #15
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    En effet ce que tu dis est logique mais... ça ne change rien, j'ai ramené la caméra à 10, et rien n'y fait. Je comprends rien, et il va pourtant falloir que ça marche un jour....

  16. #16
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    se met après le bind du framebuffer

    ça marche comme ça ?

  17. #17
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    enfin il faut en mettre un appel de glClear par framebuffer

    bindframebuffer(framebuffer);
    glclear
    ...
    bindframebuffer(0);
    glclear

  18. #18
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    J'ai déjà essayé ça :

    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
    void Render ()
    {
    	glLoadIdentity ();
     
    	gluLookAt (0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    	glRotatef (20.0f, 1.0f, 0.0f, 0.0f);
     
    	// On rend la scène dans le framebuffer
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);
    	  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         RenderScene();
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
    	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	// Puis on dessine la texture
    	glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, texture1);
    		DrawQuad ();
    	glBindTexture (GL_TEXTURE_2D, 0);
    	glDisable (GL_TEXTURE_2D);
    }
    Le plus simple, je mets totu le code :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    #include <iostream>
    #include <cstdlib>
    #include <GL/glew.h>
    #include <SFML/Window.hpp>
     
    sf::Window App;
     
    // Un quadric
    GLUquadric * sphere = NULL;
     
    // Identifiants
    GLuint framebuffer, texture1, depth, depthbuffer;
     
    void InitOGL ()
    {
    	glewInit ();
     
    	// Set color and depth clear value
       glClearDepth(1.f);
       glClearColor(0.f, 0.f, 0.3f, 1.f);
     
       // Enable Z-buffer read and write
       glEnable(GL_DEPTH_TEST);
       glDepthMask(GL_TRUE);
     
       // Setup a perspective projection
       glMatrixMode(GL_PROJECTION);
       glLoadIdentity();
     
    	glViewport (0, 0, 512, 512); // On règle le Viewport
     
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluPerspective (60.0, 512.0 / 512.0, 1.0, 20.0);
     
       glMatrixMode (GL_MODELVIEW);
       glLoadIdentity (); // On rétablit la matrice identité
     
    	// Création du quadric
    	sphere = gluNewQuadric ();
     
    	glGenFramebuffersEXT(1, &framebuffer);
       glGenTextures(1, &texture1);
       glBindTexture(GL_TEXTURE_2D, texture1);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
       //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
     
       glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
       glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, texture1, 0);
       glDrawBuffer(GL_NONE);
       glReadBuffer(GL_NONE);
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
    }
     
    void Destroy ()
    {
    	gluDeleteQuadric (sphere);
    	glDeleteFramebuffersEXT (1, &framebuffer);
    	glDeleteRenderbuffersEXT (1, &depth);
    	glDeleteTextures (1, &texture1);
    }
     
    void RenderScene ()
    {
    	// On dessine un sol
    	glBegin (GL_QUADS);
    		glNormal3f (0.0f, 1.0f, 0.0f);
    		glVertex3f (-5.0f, 0.0f, 5.0f);
    		glVertex3f (-5.0f, 0.0f, -5.0f);
    		glVertex3f (5.0f, 0.0f, -5.0f);
    		glVertex3f (5.0f, 0.0f, 5.0f);
    	glEnd ();
     
    	// Et une sphère
    	glTranslatef (0.0f, 5.0f, 0.0f);
    	gluSphere (sphere, 2.0f, 20, 20);
    }
     
    void DrawQuad ()
    {
    	// On utilise une perception 2D
    	glMatrixMode (GL_PROJECTION);
    	glPushMatrix ();
    	glLoadIdentity ();
    	gluOrtho2D (0.0, 512.0, 0.0, 512.0);
     
    	glMatrixMode (GL_MODELVIEW);
    	glPushMatrix ();
    	glLoadIdentity ();
     
    	glColor3f (1.0f, 1.0f, 1.0f);
    	glBegin (GL_QUADS);
    		glTexCoord2f (0.0f, 0.0f);
    		glVertex2f (0.0f, 0.0f);
    		glTexCoord2f (1.0f, 0.0f);
    		glVertex2f (512.0f, 0.0f);
    		glTexCoord2f (1.0f, 1.0f);
    		glVertex2f (512.0f, 512.0f);
    		glTexCoord2f (0.0f, 1.0f);
    		glVertex2f (0.0f, 512.0f);
    	glEnd ();
     
    	glPopMatrix ();
     
    	glMatrixMode (GL_PROJECTION);
    	glPopMatrix ();
    }
     
    void Render ()
    {
    	glLoadIdentity ();
     
    	gluLookAt (0.0f, 0.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    	glRotatef (20.0f, 1.0f, 0.0f, 0.0f);
     
    	// On rend la scène dans le framebuffer
    	glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, framebuffer);
    	  glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         RenderScene();
       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
     
    	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	// Puis on dessine la texture
    	glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, texture1);
    		DrawQuad ();
    	glBindTexture (GL_TEXTURE_2D, 0);
    	glDisable (GL_TEXTURE_2D);
    }
     
    int main()
    {
        // Create the main window
        App.Create(sf::VideoMode(512, 512, 32), "SFML OpenGL");
     
        // Create a clock for measuring time elapsed
        sf::Clock Clock;
     
        InitOGL ();
     
        // Start game loop
        bool Running = true;
        while (Running)
        {
            // Process events
            sf::Event Event;
            while (App.GetEvent(Event))
            {
                // Close window : exit
                if (Event.Type == sf::Event::Closed)
                    Running = false;
     
                // Escape key : exit
                if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                    Running = false;
     
                // Resize event : adjust viewport
                if (Event.Type == sf::Event::Resized)
                    glViewport(0, 0, Event.Size.Width, Event.Size.Height);
            }
     
            // Set the active window before using OpenGL commands
            // It's useless here because active window is always the same,
            // but don't forget it if you use multiple windows or controls
            App.SetCurrent();
     
            Render ();
     
            // Finally, display rendered frame on screen
            App.Display();
        }
     
    	 Destroy ();
     
        return EXIT_SUCCESS;
    }

  19. #19
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    hello

    un petit glMatrixMode(GL_MODELVIEW);
    au début de render() et ça fonctionne !


    je me demande si une classe

    framebuffer fbo(int color_buffer_status, int depth_buffer status, int stencil_status);
    avec status: NON_EXISTING, RENDER_BUFFER ou TEXTURE

    et des méthodes get_frame_buffer_id, get_color_buffer_texture_id, get_depth_buffer_texture_id...

    ne serait pas utile

  20. #20
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    OH . Mais quel con je fais !!! Je pensais pourtant que j'avais bien remis la matrice modelview en sortant de DrawQuad, et en fait non, je restait sur la matrice de projection... MERCI BEAUCOUP !!

    Pour les classes, évidemment, je ne fais que des tests de divers trucs et je souhaite garder tout ça le plus petit possible.

    En tout cas merci, ça commençait sérieusement à me saouler ça

Discussions similaires

  1. [HLSL][C++] Lecture du Depth Buffer dans un PS3.0
    Par xterminhate dans le forum DirectX
    Réponses: 6
    Dernier message: 26/09/2006, 00h34
  2. Gestion des buffers dans une fonction
    Par JiJiJaco dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2006, 11h20
  3. Copie d'un buffer dans une structure
    Par KnightsOfTheRound dans le forum C++
    Réponses: 6
    Dernier message: 29/12/2005, 15h00
  4. Comment tester un point du depth buffer.
    Par Pyou dans le forum DirectX
    Réponses: 2
    Dernier message: 02/10/2005, 21h17
  5. A propos depth buffer
    Par j.yves dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h41

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