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 :

Rendu sans recalculer la scene 3D


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut Rendu sans recalculer la scene 3D
    Bonjour,

    dans une appli developpée en Opengl, je dessine pas mal d'objets 3D (jusqu'a 10Millions de triangles). Des boites de dialogues peuvent s'ouvrir devant le viewer. Dans ces cas-la, l'utilisateur n'a plus acces a la fenetre principal et n'interagit donc plus avec la vue 3D (rotation, translation). Ca fait donc chier d'utiliser les ressources pour charger une scene qui de toute facon n'evolue plus.
    Y'a t il une solution pour dessiner la scene 3D sans avoir a reparcourir toute mon arborescence d'objets, en mémorisant le contexte ou je ne sais pas comment ?
    Si vous avez des idées ou que vous avez déja codé cela, Merci !
    A plus, jc.

  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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    si la scene est parfaitement statique, tu peut le rendre dans une texture et ensuite rendre uniquement la texture
    * 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 Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Sauvegarder le dernier rendu dans un buffer annexe

    Et recopier ce buffer dans le bon au début de chaque nouveau rendu

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Par défaut
    Si je comprends bien tes dires, tu redessines ta scène en continu, dans fonction de type 'idle', non ?
    Je serais toi, je ne redessinerais que si l'utilisateur effectue une action qui demande un rafraichissement (genre onclick, onMousemove, etc...)
    Ca ça dépend de ton API qui gère tes fenêtres et menus.
    T'utilise quoi ? wxWidget ?

    Martt

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Je developpe sous visual c++ en MFC. La fonction de dessin est appelée automatiquement (je ne sais pas exactement où, c'est un projet que je reprends).
    L'idée de sauver le rendu dans un buffer annexe, et de rendre ce buffer sauvegardé lorsqu'une boite de dialogue s'ouvre devant l'interface 3D m'interesse. C'est un truc comme cela que je cherchais.
    Est ce que tu peux m'en dire plus sur ce genre de manipulation du buffer opengl, merci.
    Bon aprem, jc.

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    en gros, ca revient à faire ca
    * 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

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Ok ! mea culpa, c'etait là, sous mon nez, et je n'ai rien vu ! Pour la peine je vais décrire le code. C'est vachement pratique, avec des gros calculs prenant pas mal de ressources (avec dlgbox et prgBar) et une scene gavée d'objets 3D.

    Ca se joue dans le OnDraw de mon CProjetView : je déclare trois nouvelles variables dans cette classe.
    -> bool bteDlgOuvertureEnCours_
    -> bool bteDlgOuverte_
    -> BYTE* sauvegardeBufferScene_

    Dans le OnDraw :
    ...
    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
     wglMakeCurrent();
     
    //La boite de dialogue est ouverte, le buffer à été sauvé précédemment
    if(bteDlgOuverte_)
    {
    int width = GetSystemMetrics(SM_CXSCREEN);
         int height = GetSystemMetrics(SM_CYSCREEN);
         glRasterPos2i(0, 0) ;
         //redessine le buffer sauvegardé
         glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE,sauvegardeBufferScene_);
    }
    else
    {
        //cas classique du parcours de toute la scene des objets 3D pour le rendre
        Dessiner();
    }
    ...
     
    //Une bte de dialog est en instance d'etre ouverte
    if(bteDlgOuvertureEnCours_)
    {            
        const int width = GetSystemMetrics(SM_CXSCREEN);
        const int height = GetSystemMetrics(SM_CYSCREEN);
     
        if(sauvegardeBufferScene_ != NULL)
        {
            //Vide le précedent buffer sauvé
        delete sauvegardeBufferScene_;
        sauvegardeBufferScene_ = NULL;
        }
     
        sauvegardeBufferScene_ = new BYTE[width * height * 3];
        //Sauvegarde du buffer dans le tableau de bytes
        glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, sauvegardeBufferScene_);
     
       bteDlgOuvertureEnCours_ = false;
       //On active le mode "dessin du buffer sauvegardé"
       bteDlgOuverte_ = true;
    }
     
    SwapBuffers();
    Et merci pour le coup de pouce !!!
    T'cho, jc.

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

Discussions similaires

  1. Rendu 3D d'un scene 2D. Par où commencer?
    Par piteon dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 16/02/2011, 22h10
  2. Faire un rendu sans les fonctions GL et GLUT
    Par bartmanb dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/04/2008, 01h01
  3. Fusion d'onglets sans recalcul
    Par corgui dans le forum Débuter
    Réponses: 1
    Dernier message: 27/02/2008, 21h32
  4. Rendu sans afficher
    Par Burckel dans le forum OpenGL
    Réponses: 4
    Dernier message: 14/12/2006, 12h59
  5. Rendu sans textures !
    Par Francky033 dans le forum DirectX
    Réponses: 5
    Dernier message: 23/09/2004, 05h03

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