Je développe actuellement un petit jeu OpenGL pour la plate-forme Android et je me demande s'il existe un moyen simple de rendre du texte au-dessus du cadre rendu (comme un HUD avec le score du joueur, etc.). Le texte devrait également utiliser une police personnalisée.
J'ai vu un exemple utilisant une vue comme superposition, mais je ne sais pas si je veux faire cela car je pourrais vouloir porter le jeu sur d'autres plates-formes plus tard.
Des idées?
android
opengl-es
text-rendering
secoué
la source
la source
Réponses:
Le SDK Android ne propose aucun moyen simple de dessiner du texte sur des vues OpenGL. Vous laissant avec les options suivantes.
la source
Le rendu du texte en une texture est plus simple que ce à quoi ressemble la démo de Sprite Text, l'idée de base est d'utiliser la classe Canvas pour rendre un Bitmap, puis de passer le Bitmap à une texture OpenGL:
la source
J'ai écrit un tutoriel qui développe la réponse publiée par JVitela . Fondamentalement, il utilise la même idée, mais au lieu de rendre chaque chaîne dans une texture, il rend tous les caractères d'un fichier de police vers une texture et l'utilise pour permettre un rendu de texte dynamique complet sans autres ralentissements (une fois l'initialisation terminée) .
Le principal avantage de ma méthode, par rapport aux différents générateurs d'atlas de polices, est que vous pouvez expédier de petits fichiers de polices (.ttf .otf) avec votre projet au lieu d'avoir à expédier de grandes images bitmap pour chaque variation et taille de police. Il peut générer des polices de qualité parfaite à n'importe quelle résolution en utilisant uniquement un fichier de police :)
Le tutoriel comprend un code complet qui peut être utilisé dans n'importe quel projet :)
la source
Selon ce lien:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Vous pouvez rendre n'importe quelle vue en bitmap. Cela vaut probablement la peine de supposer que vous pouvez mettre en page une vue selon vos besoins (y compris du texte, des images, etc.), puis la restituer sous forme de bitmap.
En utilisant le code de JVitela ci-dessus, vous devriez pouvoir utiliser ce Bitmap comme texture OpenGL.
la source
Jetez un œil à CBFG et au port Android du code de chargement / rendu. Vous devriez être en mesure de déposer le code dans votre projet et de l'utiliser immédiatement.
CBFG - http://www.codehead.co.uk/cbfg
Chargeur Android - http://www.codehead.co.uk/cbfg/TexFont.java
la source
J'ai regardé l'exemple de texte de sprite et cela semble terriblement compliqué pour une telle tâche, j'ai également envisagé de rendre une texture, mais je m'inquiète des performances que cela pourrait causer. Je devrais peut-être simplement aller avec une vue à la place et m'inquiéter du portage lorsqu'il est temps de traverser ce pont :)
la source
Regardez l'exemple "Sprite Text" dans le exemples GLSurfaceView .
la source
À mon humble avis, il y a trois raisons d'utiliser OpenGL ES dans un jeu:
Dessiner du texte est toujours un problème dans la conception de jeux, car vous dessinez des objets, vous ne pouvez donc pas avoir l'apparence d'une activité commune, avec des widgets, etc.
Vous pouvez utiliser un framework pour générer des polices Bitmap à partir de polices TrueType et les rendre. Tous les frameworks que j'ai vus fonctionnent de la même manière: générer les coordonnées de sommet et de texture du texte au moment du dessin. Ce n'est pas l'utilisation la plus efficace d'OpenGL.
Le meilleur moyen est d'allouer des tampons distants (objets de tampon de sommet - VBO) pour les sommets et les textures au début du code, en évitant les opérations de transfert de mémoire paresseux dans le temps de dessin.
Gardez à l'esprit que les joueurs n'aiment pas lire de texte, vous n'écrirez donc pas un long texte généré dynamiquement. Pour les étiquettes, vous pouvez utiliser des textures statiques, laissant du texte dynamique pour le temps et le score, et les deux sont numériques avec quelques caractères.
Donc, ma solution est simple:
Les opérations de dessin sont rapides, si vous utilisez des tampons statiques distants.
Je crée un fichier XML avec des positions d'écran (basées sur le pourcentage de diagonale de l'écran) et des textures (statiques et caractères), puis je charge ce XML avant le rendu.
Pour obtenir un taux de FPS élevé, vous devez éviter de générer des VBO au moment du tirage.
la source
Si vous insistez pour utiliser GL, vous pouvez rendre le texte en textures. En supposant que la plupart des HUD sont relativement statiques, vous ne devriez pas avoir à charger les textures dans la mémoire de texture trop souvent.
la source
Jetez un œil au
CBFG
port Android du code de chargement / rendu. Vous devriez être en mesure de déposer le code dans votre projet et de l'utiliser immédiatement.CBFG
Chargeur Android
J'ai des problèmes avec cette implémentation. Il n'affiche qu'un seul caractère, lorsque j'essaye de changer la taille du bitmap de la police (j'ai besoin de lettres spéciales), tout le dessin échoue :(
la source
Je cherchais ceci depuis quelques heures, c'était le premier article que je suis tombé et bien qu'il ait la meilleure réponse, les réponses les plus populaires sont à mon avis erronées. Certainement pour ce dont j'avais besoin. Les réponses de weichsel et de shakazed étaient juste sur le bouton mais un peu obscurcies dans les articles. Pour vous mettre directement au projet. Ici: créez simplement un nouveau projet Android basé sur un exemple existant. Choisissez ApiDemos:
Regardez sous le dossier source
ApiDemos/src/com/example/android/apis/graphics/spritetext
Et vous trouverez tout ce dont vous avez besoin.
la source
Pour le texte statique :
Pour le texte long qui doit être mis à jour de temps en temps:
Pour un nombre (formaté 00.0):
Dans votre événement onDraw, ne mettez à jour que la variable de valeur envoyée au shader.
Le code ci-dessus fonctionne pour un atlas de textures où les nombres commencent à 0 à la 7e colonne de la 2e ligne de l'atlas de polices (texture).
Reportez-vous à https://www.shadertoy.com/view/Xl23Dw pour une démonstration (avec une mauvaise texture cependant)
la source
Dans OpenGL ES 2.0 / 3.0, vous pouvez également combiner OGL View et les éléments d'interface utilisateur d'Android:
Créez la mise en page activity_gl.xml:
Pour mettre à jour les éléments du thread de rendu, vous pouvez utiliser Handler / Looper.
la source