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 :

Utilisation d'OpenGL par-dessus GDI+


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut Utilisation d'OpenGL par-dessus GDI+
    Bonjour,

    J'ai un grave problème : je n'arrive pas à utiliser à la fois OpenGL et GDI+... quand je dis GDI+, je veux dire que je n'utilise pas les CFrame et autres structures de bases de Windows, mais bien les fonctions GDI pour écrire directement sur mon écran. J'imagine que cela doit être un problème rencontré souvent, mais je n'ai trouvé que peu de choses à ce sujet... peut-être est-ce tellement simple que personne n'a besoin d'aide !

    En gros, je crée une bitmap pour faire mon backbuffer, je dessine dedans, puis je la pousse... je fais comme tout le mode quoi.

    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
     
    HDC hdcMem = CreateCompatibleDC(ps->hdc);
    HBITMAP hbmMem = CreateCompatibleBitmap(ps->hdc, rc.right-rc.left, rc.bottom-rc.top);
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem);
     
    //... rendu dans hdcMem
     
    BitBlt(ps->hdc,
               rc.left, rc.top,
               rc.right-rc.left, rc.bottom-rc.top,
               hdcMem,
               0, 0,
               SRCCOPY);
     
    SelectObject(hdcMem, hbmOld);
    Jusque là, tout va bien... jusqu'au moment ou je veux utiliser OpenGL !
    En fait, si je comprends bien, OpenGL écrit dans un Device Context grâce à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    hRC=wglCreateContext(hdc);
    wglMakeCurrent(hdc,hRC);
    Le problème, c'est que quand je lui envoie un HDC que j'obtiens avec GetDC(hWnd), et que j'utilise SwapBuffers(), il ne me dessine rien, et en plus, il remplace tout ce qui a été rendu par GDI...

    Sauriez-vous comment faire pour ne séectionner qu'un seule partie d'une fenêtre qui soit affectée par OpenGL ? J'aimerais conserver mon affichage 2D GDI+, mais venir écraser une partie de l'écran avec un affichage par OpenGL.

    Merci d'avance !

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    si tu fonctionnes en doublebuffer il faudrait commencer par dessiner au même endroit avec opengl et gdi+ parceque le SwapBuffer va échanger les affichages entre le FRONT et le BACK, question de logique

    une solution serait de faire l'affichage opengl en premier, de faire un swapbuffer et ensuite de dessiner avec gdi+
    ou alors de dessiner en singlebuffer avec opengl en limitant la zone opengl avec glScissor

    quoi qu'il en soit, je trouve que c'est une très mauvaise idée de vouloir utiliser gdi ou gdi+ avec opengl
    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.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Faire du GDI avec OpenGL drop les performances par 10 facilement.
    Car le principe est qu'a chaque rendu au lieu de faire du compositing sur la carte graphique, le rendu est rapatrié via l'agp en mémoire vive pour être placé dans ta bitmap pour dessiner par dessus et l'afficher via gdi.

    Que souhaites tu faire exactement ?
    Car on peut faire beaucoup de 2D en OpengGL.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Merci des réponses. Je pense que je vais chercher du côté du rendu sur DIB grâce au pixel format. En effet, je vais devoir désactiver le double buffering opengl, et 'après les premiers tests, j'arrive à rendre avec les 2 API sur un même écran. Pour l'instant, je rends d'abord avec openGL sur le HDC de ma fenetre, puis je fais une copie en bitmap de ce HDC, et j'écris dessus avec GDI. Sauf que cela fait du tearing pour ce qui est rendu avec openGL, normal. C'est pourquoi je vais chercher du côté de l'écriture sur DIB par OpenGL, qui permettra de faire du doubkle buffering à la sauce GDI. Cela doit être jouable, j'ai vu un bon article là-dessus.

    En ce qui concerne mes motivations pour utiliser les 2, elles sont simples. J'ai d'abord commencer une interface graphique tout en OpenGL (2D et 3D), et cela fonctionnait très bien... sur mon pc. Je l'ai ensuite testé sur un ancien pc (environ 5-6 ans), et là, les performances ont été énormément dégradées. Je voudrais rendre cette interface accessible depuis même les plus petites configurations, d'où mon passage sur GDI pour l'affichage 2D. Les performances sont mauintenant meilleures sur les pc moins performants. Cependant, je veux toujours pouvoir, si j'en ai besoin, créer des zones où la 3D pourra être utilisée (et éventuellement désactivée pour les petites configs). D'où le retour pour ces zones spécifiques à OpenGL.
    Voilà tout !

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Tout va vers le tout 3D, même les petites configurations supporteront ton application, mais c'est sur que les veilles configurations ne feront pas forcément bien tourner une application OpenGL moderne.

    Si le support des vieilles configurations est une de tes priorités, c'est une des méthodes, l'autre serait de faire une version plus light de ton interface sous OpenGL, mais je crois que n'importe quel PC plus récent, 2-3 ans peut afficher un GUI écrit via OpenGL sans trop de problème si ce n'est pas surchargé d'effets via des shaders.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Ca y est, je suis venu à bout de ce couplage ! J'arrive maintenant à écrure dans un HBITMAP de GDI.

    Pour ceux que ça intéresse, je me suis inspiré de la page suivante :

    http://www.rsdn.ru/article/opengl/layeredopengl.xml

    C'est en russe (on peut pas tout avoir), mais le code est suffisemment explicite. Je ne parle pas un mot de russe (et j'en lis encore moins), mais j'y suis arrivé quand même.

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Citation Envoyé par Dmnbp7ip Voir le message
    cela fait du tearing pour ce qui est rendu avec openGL, normal. C'est pourquoi je vais chercher du côté de l'écriture sur DIB par OpenGL, qui permettra de faire du doubkle buffering à la sauce GDI. Cela doit être jouable, j'ai vu un bon article là-dessus.
    tant que j'y pense, si tu fais du double buffering avec GDI, tu peux toujours faire du rendu double buffering avec opengl MAIS tu ne fais pas de SwapBuffer

    plutot que de récupérer le rendu opengl dans le front buffer (en rendu single buffer), tu le récupères dans le back buffer et le copie dans ton back buffer GDI, ça éliminera le tearing et tes yeux seront content
    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.

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    C'est le même article que j'ai utilisé il y a quelques années, c'est la seule source d'information correct et explicite que j'avais trouvé jusqu'alors, je m'en suis servit pour faire une application qui faisait de la transparence au pixel sous Windows (le sujet même de l'article), et c'était assez l'horreur niveau performance.

    Peu importe la langue de la page, le code est universelle

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/01/2014, 08h49
  2. visualisation des objets 3d par utilisation de opengl
    Par the_king dans le forum OpenGL
    Réponses: 16
    Dernier message: 16/05/2006, 16h43
  3. Réponses: 1
    Dernier message: 16/02/2005, 12h04
  4. [HTTP] Comment utiliser les POST par programation
    Par Popof dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 31/01/2005, 09h14
  5. Mettre du texte sur une vidéo(ou par dessus un tmediaplayer)
    Par souch dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/07/2004, 13h30

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