2009-01-05 6 views
2

J'essaie de trouver un moyen de combiner le rendu OpenGL et GDI sous Windows. Auparavant, je restituais mon contenu OpenGL dans un objet framebuffer, l'extrayais puis le fusionnais dans le contexte graphique GDI de Windows, puis dessinais mon contenu GDI par-dessus. C'est vraiment paralysant le framerate. Je voudrais faire le contraire de ce que je fais maintenant, donc mon rendu OpenGL est fait directement à la fenêtre et ensuite je rends les choses GDI à un bitmap qui est téléchargé sur une texture et ensuite superposé en utilisant un quad . Les trucs GDI ne changent pas tellement que je n'ai pas besoin de redessiner chaque image, je peux juste mettre en cache la texture. Je peux presque le faire fonctionner, le problème est que je n'arrive pas à obtenir les valeurs alpha correctes à partir de l'image bitmap GDI, donc le texte et les lignes sont horriblement déchiquetés.Mixage OpenGL et GDI sous Windows

Quelqu'un at-il des ressources utiles pour ce faire? Est-il même possible d'écrire GDI ou GDI + dans le canal alpha de la façon dont j'ai besoin?

+0

J'ai oublié, est-ce que GDI (+) supporte les couleurs 32 bits? – Brian

+0

Je le crois. Je fournis un bitmap BGRA à GDI pour le rendu. Le problème est que l'alpha ne s'écrit que 0 ou 255. – Matt

+0

Avez-vous un exemple de code pour la façon de rendre la texture GDI? –

Répondre

2

Je pense que ce serait plus facile si vous utilisiez simplement OpenGL brut pour rendre plutôt que le GDI. Créez simplement des fonctions wrapper et appelez-les à la place du GDI.

2

Tout ce qui est vraiment nécessaire? Vous devriez pouvoir utiliser les fonctions GDI pour dessiner sur le même contexte de périphérique que votre OpenGL.

+0

oui c'est vrai je le fais tout le temps mais ce besoin certains travaillent pour éviter de scintiller ... – Spektre

0

Que diriez-vous d'employer le pochoir. Répliquez votre texture dans le tampon du stencil. Utilisez GL_NOTEQUAL comme fonction de test avec une valeur de référence égale à la valeur de fond de la texture. Rendez d'abord les éléments OpenGL, puis activez le pochoir, puis affichez votre rectangle texturé.

Vous ne spécifiez pas s'il s'agit d'un problème 2D ou 3D. Jaggies peut être un problème de profondeur dans un monde en 3D où tout est presque dans le même plan. Si vous travaillez en 3D, assurez-vous que le rectangle texturé est devant tout le reste ou modifiez le z-buffer.