Texte indépendant de la résolution de rendu

11

J'ai besoin d'un moyen de dessiner du texte indépendant de la résolution dans mon jeu. Autrement dit, je dois pouvoir zoomer sur le texte et ne jamais voir les artefacts de pixels.

Quelqu'un peut-il faire des suggestions sur la façon dont je pourrais procéder?

Mike
la source
Je suppose que vous devrez étudier les méthodes des polices vectorielles plutôt que les polices tramées, ce qui pourrait être un point de départ. Je ne suis pas un expert en la matière, je vais donc laisser quelqu'un qui sait répondre.
Ray Dey

Réponses:

7

Il y a trois façons courantes de le faire. Il ne s'agit pas vraiment d'éliminer complètement les artefacts - ce qui est impossible, à moins que vous n'ayez une mémoire ou un temps processeur illimités - mais plutôt de les réduire au minimum d'une manière qui corresponde à votre code existant et aux plates-formes cibles.

Tout d'abord, utilisez simplement votre tramage de polices - généralement FreeType - pour pixelliser la police à la taille souhaitée lorsque vous effectuez un zoom avant. Cela aura fière allure dans les captures d'écran, mais c'est incroyablement lent. Vous pouvez résoudre la lenteur en mettant en cache les tailles, mais cela devient incroyablement gourmand en mémoire. Il n'a pas non plus fière allure en mouvement, car pour que les glyphes soient bons pour l'affichage statique, il faut les mettre à l'échelle de manière non uniforme. Pourtant, c'est une option si vous êtes sur une plate-forme avec suffisamment de mémoire (comme un PC) et que vos balances sont limitées à une petite plage, comme 10px à 30px. Cette méthode n'admet pas non plus beaucoup de bonbons pour les yeux en soi.

Deuxièmement, vous pouvez stocker votre texte sous forme de maillage. Certaines bibliothèques existent pour le faire, comme GLTT , ou vous pouvez écrire les vôtres. Maintenant, vous n'avez plus d'artefacts de pixels, mais vous aurez des artefacts polygonaux si vous zoomez très près - comme tout autre maillage dans un jeu 3D. Le texte de maillage admet beaucoup de plaisir pour les yeux car les vertex shaders peuvent être appliqués et le maillage peut être entrelacé avec tout autre dessin du monde que vous faites. Il est relativement léger en mémoire et en CPU, et facile à mesurer le coût car il s'agit juste d'un maillage standard. Il peut être difficile de l'intégrer dans un pipeline de rendu 2D basé sur un sprite normal.

Troisièmement, vous pouvez utiliser des champs de distance en combinaison avec un pixel shader . Il s'agit d'une technique relativement nouvelle qui est actuellement populaire, utilisant un simple shader pour échantillonner une texture prédéfinie et le filtrage bilinéaire "gratuit" sur votre carte vidéo pour augmenter proprement les glyphes. Il utilise peu de mémoire et facilement prévisible par rapport aux autres méthodes - une texture de 0,5 Mo à 1 Mo par jeu de caractères et police. Il s'intègre parfaitement dans les pipelines de rendu basés sur les sprites car il est basé sur les sprites; chaque glyphe est toujours un quad texturé. Il produit des artefacts de pixels, mais très peu par rapport à d'autres méthodes qui mettent à l'échelle les textures. Il existe également une solution de remplacement à fonction fixe si les shaders de pixels ne sont pas disponibles, mais le texte se retrouve très aliasé. Étant donné que l'échantillonnage est effectué dans un pixel shader, il admet des bonbons pour les yeux, comme le contour et l'ombrage, pour pas cher.


la source
3

Il existe également un article de recherche de Microsoft Research par Loop et Blinn, sur le rendu des courbes indépendantes de la résolution à l'aide de shaders. Il suggère d'utiliser la technique présentée pour rendre le texte TrueType d'une manière indépendante de la résolution.

macbirdie
la source
1

Vous devrez créer vos caractères de police à partir d'une combinaison de courbes et de lignes, que vous convertirez ensuite en géométrie avec un niveau de détail approprié lors de l'exécution.

Heureusement, la plupart des polices sont déjà construites à partir de courbes de Bézier. Pour obtenir les données de courbe, il vous suffit d'utiliser la fonction standard Windows GetGlyphOutline () pour les extraire.

Je ne sais pas si vous pouvez obtenir ces données de courbe à partir de C # sans PInvoke.

Adam
la source
1
Afin de créer cette plateforme multiplateforme et de ne pas vous soucier des trucs PInvoke, il me semble que vous seriez en mesure d'écrire un outil pour vider les données que GetGlyphOutline lit (voir cette question SO ) dans un format personnalisé, puis avoir quelques E / S de fichiers simples dans le code du jeu pour charger simplement vos données de glyphes stockées personnalisées.
Ricket
0

Vous voudrez peut-être jeter un œil au type libre. Je ne sais pas si elle est disponible sur votre plate-forme ou si la licence est applicable mais c'est une excellente bibliothèque open source pour le rendu de polices vraies et autres polices vectorielles. Je crois qu'ils ont dû faire un avocat intelligent en esquivant le code afin que les polices soient rendues de manière esthétique. La véritable méthode de type implique des codes d'octets sur les courbes pour fournir des conseils au rendu afin que les fonctionnalités de police importantes (telles que les verticales et les empattements) ne soient pas floues comme elles le feraient avec l'anti-aliasing naïf standard. Cette technique a un brevet sur elle, donc les gens du freetype ont dû trouver quelque chose d'autre qui a fait le travail et n'a pas invoqué le terrible avocat-bête (je pense) d'Apple. Quoi qu'il en soit, en dehors de la programmation légale, essayez de chercher du freetypehttp://freetype.sourceforge.net/index2.html

Luther
la source