Se connecter avec
S'enregistrer | Connectez-vous

GDI: Acceder au back buffer

Dernière réponse : dans Programmation

Hello,

Je suis actuellement sur un projet OpenGL et j'aimerais afficher du texte a la fin de chaque frame au dessus de mon dessin OpenGL, pour ca j'utilise le GDI c'est plus simple pour moi (CreateFont(), DrawText(),...).

Le probleme c'est que je dois donc dessiner le texte ds le back buffer juste comme le dessin openGL ms je sais pas comment acceder au black buffer :??: 

  1. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  2. glLoadIdentity();
  3.  
  4. // Code de dessin OpenGL...
  5.  
  6. DrawText( hDC, "123", 3, &rcRect, 0 ); // Dessine ds le Front buffer, devrait etre dans le back buffer
  7.  
  8. SwapBuffers( hDC ); //A la fin, on affiche le tout


Voila, merci de m'aider!

Autres pages sur : gdi acceder back buffer

Lassé par la pub ? Créez un compte

Aux dernières nouvelles, avec le GDI tu peux pas toucher au backbuffer, vu qu'il supporte pas les pixelformats en double buffering. La seule solution consiste donc à passer en singlebuffer.

Maintenant je dis pas que je suis sûr de mon coup à 100%...

Oui enfin dans ce cas là, faut faire tout le rendu des polices à la main... Lui souhaitait justement utiliser ça pour se simplifier la vie. Y'a un bon tuto avec tout le code nécessaire pour les polices sur le site de NeHe, mais bon, vla la galère...

Sinon en le dessinant sur le front, ça clignote non ? Ou alors ça marche pas du tout ? Faudrait p'tet aussi essayer de faire tout ton truc en GDI au moment où tu reçois un WM_PAINT, pas sûr, mais c'est à tenter...
Expert Programmation

ça ne devrait pas régler le problème, WM_PAINT est juste un message. Pour tout afficher il faudrait verrouiller soit en le bloquant, soit par double-buffering. On en revient donc au même problème. Tu peux juste réduire le clignotement (généralement dû à l'effacement du widget).
Expert Programmation

Si les profs t'ont dit que WM_PAINT empêche le clignotement, c'est qu'ils n'ont pas compris d'où il vient ou qu'ils n'ont pas compris à quoi servent les messages windows (ou les deux :)  )

C'est pas que ça empêche le clignotement, juste que ça permet de dessiner au bon moment. D'ailleurs après une petite recherche, c'est dingue le nombre de mecs qui font leur bordel en GDI sur le WM_PAINT... ;) 

Hm je travail avec Code::Blocks et je peux pas inclure glut, j'ai fait le tour des forum et j'ai vu bcp de cas pr ce probleme mais il n'existe pas de solution...

Bon alors je vais etre symple: Comment on fait pr afficher du texte par dessus du dessin OpenGL sans clignotement (si y a moyen)

Pcq on peut meme pas creer de context OpenGL ds un mem buffeur, relou!

J'ai aussi essayer en faisant un GetPixel a la fin de chaque frame ms je pert du FPS a crever...

J'ai l'impression ke je me suis une fois de plus heurte a un probleme sans solution :( 
Expert Programmation

ton impression est exacte puisque microsoft indique qu'on ne peut pas utiliser le doubl-buffering. Or celui-ci est le seul moyen efficace pour éviter le clignotement. Donc, le mieux c'est de faire ta police de caractère (ou la charger à partir de celle de l'os)et de les gérer finalement comme des images (voir le tuto de NeHe).

Ouaip c'est justement ce aue j'ai fait ^^ J'avais utiliser se systeme pour un programme avec DirectDraw donc j'ai fait un copier coller du code. Par contre pour ce qui est de l'afficher j'ai fait un glDrawPixel apres avoir calculer moi-meme les pixels de l'image donc c'est un rien plus lent. Ca ce remarue pas ms a mon avis faudra pas que j'affiche du texte a toutes les sauces!

Probleme resolu!
Lassé par la pub ? Créez un compte
Tom's guide dans le monde