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

C++Builder Discussion :

Cr�ation d'une Miniature d'une vue OpenGL


Sujet :

C++Builder

  1. #1
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par d�faut Cr�ation d'une Miniature d'une vue OpenGL
    Bonjour � tous.

    Je travail actuellement sur un logiciel de calcul sur pi�ce m�canique qui inclus �galement un outils de visualisation des pi�ce m�canique en 3D.
    Mon environnement de d�veloppement est Embarcadero� RAD Studio XE et tout est fait en C++.

    Ces vues 3d sont faite avec OpenGL et il peut y avoir plusieurs vues ouverte en m�me temps.

    J'aurais besoins, pour un nouveau module du logiciel , de cr�er un fen�tre contenant les aper�us de toutes les vue 3D ouverte. Un petit peu comme la fen�tre qui apparait sous Vista lorsqu'on fait alt+tab pour naviguer entre les fen�tres.

    Pour le moment j'arrive � lister toutes les vue 3D ouvertes, �a aucun probl�me. Je r�cup�re les TForm associ�es �galement.

    Ensuite, pour l'aper�u, j'ai essay� diff�rentes techniques :
    - L'utilisation de la fonction GetFormImage() de la classe TForm me fait un screenshot de la TForm mais sans la vue 3D. La zone ou devrait apparaitre la vue est tout simplement vide.

    -L'utilisation de la fonction glReadPixels. C'est avec cette fonction que j'ai eu les meilleurs r�sultats. Le hic c'est que je passe par un fichier temporaire pour convertir les pixel en un object Graphics::TBitmap.

    Ne connaissant pas du tout le fonctionnement d'OpenGL j'ai repris les m�thode de ce site pour la lecture des pixel et l'�criture du fichier .bmp


    http://neogamedev.chable.net/index.php?PageID=2018
    (section "Ecrire une image Bitmap")

    Et il y aussi d'autres petits soucis avec cette m�thode :
    Si la fen�tre TForm contenant la vue 3D a �t� r�duite � un tr�s petit format (100x100 par exemple), le fichier .bmp temporaire cr�� est valide (selon l'aper�u windows).
    Mais si ma fen�tre est agrandie le fichier .bmp cr�� n'est plus valide(selon l'aper�u windows toujours), mais je peu tout de m�me le visualiser avec paint. Et les couleurs de ma pi�ce m�canique ne correspondent plus � ma vue 3D.

    Dans tous les cas j'arrive � charger l'image dans un objet Graphics::TBitmap � l'aide de la m�thode LoadFromFile. Je redimensionne mon image � une taille d'environ 150x150 pour en faire un aper�u. Et apr�s redimensionnement j'ai un autre soucis, mon image manque de nettet�.

    Donc au final je souhaiterai savoir pourquoi l'utilisation de la m�thode glReadPixel et l'�criture de l'image dans un fichier �choue si ma vue 3D est "trop grande".

    Et je souhaiterai �galement savoir s'il existe des techniques pour am�liorer la nettet� � l'affichage d'un objet Graphics::TBitmap (� l'aide de filtre ou autre).


    Merci d'avance!!!!

  2. #2
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 035
    Billets dans le blog
    12
    Par d�faut
    En tout cas, je ne sais pas si tu maitrises la partie OpenGL, mais tu peux aussi passer par les FrameBufferObject pour faire le dessin en 2 endroits :
    1 - la fen�tre (pour l'affichage normal)
    2 - dans une texture (un buffer de pixels) que tu chargerais dans tes Graphics::TBitmap. Le mieux pour cela serait d'allouer un TMemoryStream qui recevrait directement les pixels de la texture, et tu ferais un LoadFromStream � partir de ton TBitmap.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  3. #3
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par d�faut
    Merci beaucoup pour les infos.

    Non malheureusement je ne maitrise pas la partie OpenGL, enfin pas encore ! C'est l'occasion de s'y mettre.

    Je suis en train de me renseigner sur les frameBufferObject et ce que je pourrait faire avec.
    J'ai d�j� regard� quelques info et effectivement �a pourrait tout a fait convenir au traitement que je cherche � r�aliser. En revanche l'utilisation de cet objet pourrait m'obliger � faire des modifications majeures. Mais je garde cette option.

    Je continue mes recherche et je vous tient au courant!

  4. #4
    Membre exp�riment�

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par d�faut
    Tu n'as pas besoin de passer par un fichier temporaire pour assigner une image dans un TBitmap. Tu peux tout faire en m�moire:
    Tu Dump le contenu de la fen�tre OpenGL dans un Buffer (pBits) et tu recopie ce buffer dans celui de TBitmap.

    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
    BYTE* pBits = new BYTE[nWidth*nHeight];
    BYTE* pOri = pBits;
    BYTE* pDst;
    glReadPixels(0,0,nWidth,nHeight, 
                     GL_BGRA_EXT, GL_UNSIGNED_BYTE, pBits);
    Graphics::TBitmap* pBmp = new Graphics::TBitmap();
    pBmp->Width = nWidth;
    pBmp->Height = nHeight;
    pBmp->PixelFormat = pf32Bits;
    for (int nRow=0; nRow<pBmp->Height; nRow++) {
      pDst = pBmp->ScanLine[nRow);
      for (int nCol=0; nCol<pBmp->Width; nCol++) {
        *pDst++ = *(pOri++);  // B
        *pDst++ = *(pOri++);  // G
        *pDst++ = *(pOri++);  // R
        *pDst++ = *(pOri++);  // A
      }
    }
    Il y a surement quelques coquilles, j'ai tapp� �a vite fait.
    J'esp�re que �a r�ponds � ton probl�me.

  5. #5
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par d�faut
    Bonjour � tous par cette belle journ�e de printemps !!!

    Bon alors, apr�s consultation de pl�thore de tutoriel, forum ... je conclut que la solution � appliquer est bien l'utilisation de Frame Buffer Object.

    D'un point de vue th�orique j'ai saisi la marche � suivre. D'un point de vue pratique c'est autre chose...

    Je vais essayer de r�sumer ce que j'ai compris de cet outils.
    A la cr�ation de la vue 3D j'initialise une texture T dans laquelle tout mon mod�le en trois dimensions sera trac�.
    Ensuite j'initialise un fbo que je lie avec ma texture T.
    J'active le fbo avant de dessiner des formes.
    Je dessine mes formes.
    Et ensuite soit je les affiches � l'�cran, soit le fait le transfert fbo-> bitmap.

    Donc la mise en place de cet outil n'aura aucun impact sur mes m�thodes de dessins d�j� existantes ?

    Autre petite question, mon image sera au format 200*200 � peu pr�s, et donc pour que la qualit� soit optimale il faudrait que le buffer que je transfert en bitmap soit aussi au format 200*200. (la r�duction d'une image bitmap ne donne pas de r�sultat correct).
    Est ce que cela m'oblige � relancer le dessin de ma vue au format souhait� ?


    Merci beaucoup yarp pour ce morceau de code, �a me sera tr�s utile! J'essaie �a d�s que j'ai r�ussi � mettre en place mon fbo ! Je me doutait bien qu'on devait pouvoir faire �a.

  6. #6
    Membre exp�riment�

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par d�faut
    > Autre petite question, mon image sera au format 200*200 � peu pr�s, et
    > donc pour que la qualit� soit optimale il faudrait que le buffer que je
    Dans l'exemple que je t'ai donn� tu as directement les Pixels de l'image dans le buffer pBits. Il te suffit de les redimensionner en 200x200 - facile.
    Ce ne sont pas les algos qui manquent sur le net.

    Perso j'utilise ceci (Regarde la fonction Scale):
    http://www.codeproject.com/KB/graphics/CBitmapEx.aspx

    Sinon tu trouvera des exemples similaires dans toutes les librairies d'image, mais il te faudra decortiquer un peu plus.

    Il y a aussi ce site qui contient de nombreux exemples sur le traitement d'image avec la VCL:
    http://www.efg2.com/Lab/Library/Delphi/index.html

  7. #7
    Membre actif
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par d�faut
    Merci pour les info.

    J'avais d�j� vu comment redimensionner mon TBitmap en utilisant la STL.

    Mes images se redimensionnent correctement, �a aucun soucis.

    Mais mon petit soucis c'est que le mod�le 3D n'est constitu� que de traits repr�sentant des �l�ments qui composent ma pi�ce m�canique. Et au r�tr�cissement de l'image certains trait passent � la trappe, et il est difficile de reconnaitre l'image d'origine.

    C'est pour �a que je me disais que redessiner la vue en plus petit format en ofscreen avant de cr�er la bitmap pourrait corriger ce petit probl�me.

    Mais j'ai toutes mes cl� en main maintenant je devrai pouvoir m'en sortir.

    Merci beaucoup pour vos r�ponses!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    R�ponses: 6
    Dernier message: 08/09/2010, 12h59
  3. R�ponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est coch�e
    Par JessieCoutas dans le forum Macros et VBA Excel
    R�ponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    R�ponses: 8
    Dernier message: 21/06/2007, 13h48

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