J'utilise la bibliothèque FTGL pour rendre les polices dans mon jeu, mais je ne sais absolument pas comment créer un contour autour du texte. Atteindre une ombre pourrait être facile, car je peux simplement le faire comme ceci:
(pseudo code)
font.render(Color::BLACK, position.x + 1, position.y + 1); // Shadow
font.render(Color::WHITE, position.x, position.y) // Normal text
Mais comment créer un contour? Malheureusement, je n'ai trouvé aucune solution intéressante sur Internet, ce qui m'a semblé un peu étrange, car je pensais que c'était un problème assez populaire.
Dessiner un contour avec juste une police plus grande n'est pas une bonne façon, car comme je l'ai découvert, les lettres ne correspondent tout simplement pas dans ce cas:
Existe-t-il un moyen simple de créer un contour pour les polices? Comment font-ils dans les vrais jeux?
Merci d'avance pour toute réponse
Réponses:
Flexible et précis: filtres
Utilisez un filtre texel soit sur la texture côté CPU, soit si vous utilisez le pipeline programmable OpenGL, directement dans le fragment shader.
L'idée d'un filtre est simplement que vous exécutez une boucle 2D pour traiter chaque texel. S'il est blanc, vous exécutez une boucle 2D intérieure pour chacun de ses pixels environnants dans un certain rayon et vous vous adaptez en conséquence. Ceci est également connu comme un filtre de boîte, bien que si vous incluez la vérification du rayon, c'est vraiment un filtre circulaire - ce qui évite les artefacts axiaux.
Un moyen plus rapide de procéder consiste à précalculer l'ensemble des décalages de chaque pixel central que vous vérifiez; de cette façon, vous n'avez pas besoin d'exécuter une racine carrée pour chaque pixel entourant un pixel donné. Vous voulez limiter la complexité à `O (texWidth * texHeight) plutôt qu'à O (texWidth * texHeight * filterRadius * filterRadius), en d'autres termes.
Facile: plusieurs rendus
Une autre façon d'obtenir l'effet serait de ne pas mettre le texte à l'échelle, mais plutôt de rendre votre contour rouge dans chacune des huit (ou plus) directions, chacune légèrement décalée de l'original dans cette direction:
En compensant chacune des versions rouges comme celle-ci, vous obtiendrez un bord extérieur assez uniforme autour de votre texte d'origine. Gardez à l'esprit que lorsque vous déplacez en diagonale, vous devez utiliser la même amplitude vectorielle que lorsque vous déplacez horizontalement ou verticalement, plutôt que de simplement compenser par les mêmes valeurs x et y (ce qui conduit à une longueur approximative de 1,4 fois plus - trig de base).
FYI
Ce type d'effet est connu sous le nom de dilatation, et est parfois effectué via Minkowski Summation , qui est l'approche vectorielle (continue) du filtre de boîte à pixels (quantifié) que j'ai décrit ci-dessus.
la source
Cette fonctionnalité est implémentée directement dans FTGL mais elle n'est disponible que dans la
ExtrudeFont
classe. Vous définissez simplement un début pour la police:Ensuite, vous pouvez utiliser une couleur différente pour les deux modes de rendu:
Voici le résultat, avec l'antialiasing activé / désactivé:
la source
Pas lié à FTGL mais il y a un excellent article de Valve sur le rendu des glyphes. Il offre un rendu de haute qualité avec peu de mémoire et des effets tels que les contours ou les ombres peuvent être simplement implémentés.
la source