Manière préférée de rendre le texte dans OpenGL [fermé]


17

Je suis sur le point de reprendre une infographie pour un projet universitaire. Pour un projet précédent, j'ai utilisé une bibliothèque appelée FTGL qui ne m'a pas satisfait car elle me semblait un peu lourde (j'ai essayé beaucoup de techniques de rendu, le rendu de texte n'était pas très bien mis à l'échelle).

Ma question est, existe-t-il une bonne bibliothèque efficace pour cela? Sinon, quelle serait la façon de mettre en œuvre un texte rapide mais agréable à regarder? Certaines utilisations prévues sont:

  • Étiquettes d'objets / caractères flottantes
  • Dialogues
  • Les menus
  • HUD

EDIT: de préférence, il pourrait également charger des polices


1
Il s'agit d'une question "quelle technologie utiliser", et devrait donc probablement être fermée.
Laurent Couvidou

Réponses:


4

L'interface graphique de Crazy Eddie est un framework populaire .

Mais bien que cela soit attrayant, il n'est pas inhabituel de rouler le vôtre (et peut-être le regrettera car la portée augmente plus tard;))

Il est normal d'avoir vos glyphes sur des bitmaps, puis de dessiner les bitmaps à l'aide d'OpenGL.

Parfois, vous affichez du texte transitoire qui ne peut apparaître que pour une poignée de cadres. Utiliser GL_QUADS + glVertex suffit. Mais pour toute grande quantité de texte ou toute longue durée de visibilité, il vaut la peine de mettre le GL_QUADS dans un VBO - j'ai remarqué de grandes améliorations de performances.

Il y a bien sûr la question de générer les glyphes réels dont vous avez besoin. Il existe des programmes comme bmfont que vous pouvez utiliser pour cela. Ou vous pourriez avoir besoin d'un rendu un peu plus compliqué, par exemple du freetype à la demande. J'ai utilisé bmfont avec mon propre moteur de rendu très heureusement, c'est très simple à déduire.


9

Il y a beaucoup de façons - selon ce que vous voulez ... Comme partout ailleurs, il n'y a pas quelque chose comme "la meilleure solution". Quelle plate-forme est votre cible? Quelle langue utilisez-vous? Qu'en est-il du redimensionnement / rotation du texte - est-ce nécessaire? Avez-vous besoin de pouvoir rendre TrueTypeFonts? Qu'en est-il du multilingue / Unicode? Comment voulez-vous stocker votre texte (quel encodage etc.)?

J'ai utilisé dans le passé également FTGL, ainsi que du freetype pur (http://www.freetype.org/ FTGL est basé sur cela), différents types de polices bitmap, polices de contour ... Maintenant, je suis surtout accro au bitmap polices, mais c'est seulement ma préférence personnelle. Parce que je ne veux plus m'occuper de différents jeux de caractères, d'encodage et de trucs comme ça - et l'octroi de licences pour les bitmapfonts est également plus facile et moins cher que pour les TrueTypeFonts. Et son utilisable sur chaque plate-forme qui peut charger des images. J'utilise simplement un quad en openGL et mappe une partie de ma texture dessus. L'autre côté est le suivant: la police sera uniquement redimensionnable propre à un facteur d'environ +/- 50%. Si vous pouvez vivre avec cela, je suggère d'utiliser une police bitmap.

Si vous devez également gérer différents encodages / jeux de caractères, vous devez trouver un moyen de charger et d'utiliser TrueTypeFonts (comme avec freetype, en utilisant une autre bibliothèque ou avec votre propre implémentation) ...

Jetez également un œil aux différents didacticiels sur ce sujet:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Polices bitmap

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Polices de contour

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Polices de contour mappées par texture

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Police de texture 2D

Bonne chance!


+1 Merci pour les précieuses informations sur les performances, je connaissais les didacticiels de NeHe. Je pense que j'ai utilisé des polices bitmap ... mais ça n'a pas évolué: environ 60 étiquettes flottant dans une scène au-dessus de sphères reliées par des lignes, un aperçu de cela? (Je pensais que j'aurais dû chercher un moyen de mettre en œuvre un modèle de poids de mouche)
dukeofgaming

1
Attention: les tutoriels de NeHe sont pour l'ancien pipeline de fonctions fixes et ne sont pas mis à jour souvent. Si vous cherchez une solution OpenGL moderne, voir stackoverflow.com/questions/5262951/…
brita_

6

Si vous souhaitez utiliser des polices bitmap, vous ne pouvez pas vous tromper avec le générateur de polices bitmap Angelcode: http://www.angelcode.com/products/bmfont/

Il convertit une police TrueType en une ou plusieurs textures (avec des glyphes bien emballés) et génère un petit fichier contenant les UV et les espacements (je trouve que la sortie XML est particulièrement facile à utiliser et la qualité des données d'espacement est généralement très bon, même sans vrai crénage)



0

Considérez QML . Il s'agit d'une bibliothèque d'interface utilisateur entièrement fonctionnelle avec une syntaxe facile à utiliser. Son ensemble de fonctionnalités est nettement meilleur que CEGUI dans mon expérience, et il a une meilleure documentation, un meilleur support et une meilleure communauté car sa cible principale est les applications de bureau et la possibilité de rendre hors écran est juste une sorte de bonus.

Avantages:

  • Il utilise OpenGL sur le back-end pour tout le rendu
  • Il peut charger n'importe quelle police disponible sur le système hôte et peut également analyser les polices supplémentaires que vous incluez en tant que ressources
  • Il utilise un rendu de texte de champ de distance signé pour une sortie efficace et de haute qualité
  • Il peut être rendu directement sur une texture OpenGL, vous pouvez donc placer facilement les résultats dans votre environnement de jeu
  • Qt a beaucoup de liaisons linguistiques

Les inconvénients:

  • Qt est un grand framework
  • L'utilisation de QML dans des projets Direct3D ou Vulkan nécessite de sauter à travers des cerceaux pour obtenir la texture GL dans l'API appropriée (ou d'attendre que quelqu'un écrive des rendus D3D / Vulkan natifs pour QML)
  • Il y a encore quelques bizarreries mineures dans QML où il essaiera d'utiliser un contrôle natif même si vous effectuez un rendu sur une surface hors écran, comme lorsque vous essayez d'ouvrir une liste déroulante pour un élément de liste.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.