Question

Je suis en train de trouver un simple à dessiner un texte en OpenGL. Ma recherche a montré sa tâche assez complexe. Il consiste à créer (ou la génération à l'exécution) une texture atlas de la police, et puis en créant un quad pour chaque lettre avec juste les bonnes coordonnées de placement et de texture.

Je l'ai entendu de bonnes choses au sujet de freetype, mais ai trouvé très peu de choses sur la façon de le faire fonctionner sur l'iPhone, et il semble être assez complexe.

est-il Objective-C enveloppé bibliothèque de textes OpenGL qui fonctionne avec le SDK iPhone que les gens utilisent? Ou suis-je un peu plus de penser cela et il y a une approche plus facile que je suis absent?

Était-ce utile?

La solution

Votre description de FreeType pour créer un atlas de texture ainsi que toutes les informations glyphe est exactement ce que je fais dans mon projet actuel de l'iPhone.

Je fais tout l'analyse syntaxique de la police dans une étape de pré-processus (Tous en C # sur Windows comme il arrive). L'atlas lui-même est généré et ne contient que les caractères nécessaires - pour réduire l'espace, je aussi finissent parfois générer plus d'un atlas pour garder des textures tailles pow2 et d'une résolution raisonnable.

Vous pouvez facilement tirer les informations de glyphe de freetype. Passez que le long de votre application ainsi que les textures à l'exécution et il est assez trivial de modifier simplement les coords UV de la texture au besoin.

Pour ce que ça vaut la peine, voici comment je définis un caractère glyphe dans mon petit moteur:

struct FontGlyph
{

u32 char_code;

u32 m_x;                // base x position on tpage

u32 m_y;            // base y position on tpage

u32 m_width;            // glyph width

u32 m_height;           // glyph height

i32 m_horiBearingX;     // Distance to X shift

i32 m_horiBearingY;     // Distance to Y shift

u32 m_horiAdvance;      // Total Horizontal advance this character requires

u32 m__tpage_index;     // Which tpage does this glyph use?

};

J'ai alors un objet « SpriteString », qui se comporte à peu près comme toute autre chaîne, à part que je peux le dessiner en utilisant sprites ....

Je suis d'accord tout cela peut sembler un gros travail pour un problème assez trivial, mais je l'ai trouvé m'a donné beaucoup de flexibilité et vraiment n'a pas pris tout ce temps pour mettre en œuvre quand je suis arrivé de descendre.

Sentez-vous libre de répondre ou commenter si vous avez besoin d'autres détails. (Et bonne chance:)


Réponse à votre commentaire que je courais de place dans la section des commentaires ...

Consultez la documentation de freetype, il vous donne essentiellement les données de glyphe sans vous embêter, il tire juste à droite de la police. En ce qui concerne les textures elles-mêmes, vous obtenez freetype pour rendre chaque glyphe, puis gérer que pour construire la texture. Ce que je fais en tant que pré-processus entièrement distinct de mon application principale.

Voici un extrait de mon code d'outil qui fait ceci: http://pastebin.com/md1c6354

S'il vous plaît noter cependant, ce ne fut jamais destiné à mes yeux et non pour la consommation publique, donc excuse le fait qu'il est en désordre comme l'enfer:)

Autres conseils

Une façon de le faire est de mettre en place un UILabel puis rendre sa couche dans une texture. Une voie indirecte à ce serait d'abord mis en place le UILabel avec le texte, la police, etc., puis utilisez le code suivant

UIGraphicsBeginImageContext(yourLabel.frame.size);
[yourLabel.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *layerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

pour capturer l'UILabel à un UIImage. Vous pouvez ensuite utiliser le initWithImage. Constructeur de la classe Texture2D dans le projet CrashLanding pour transformer cela une texture

Il ressemble initWithImage: dans cet exemple re-rend le UIImage à un contexte bitmap et utilise pour créer la texture. Avec un peu de travail, vous pouvez extraire le code approprié de cette méthode et de modifier le code ci-dessus pour rendre votre couche directement dans la texture.

De cette façon, vous obtenez le joli support Unicode et la police UILabel lors de la création du texte pour votre texture.

J'ai trouvé une solution simple à cela. Voici une fonction rapide je l'ai écrit pour lui. (Vous aurez besoin de la classe Texture2D.)

- (void) drawText:(NSString*)theString AtX:(float)X Y:(float)Y {
// Use black
glColor4f(0, 0, 0, 1.0);

// Set up texture
Texture2D* statusTexture = [[Texture2D alloc] initWithString:theString dimensions:CGSizeMake(150, 150) alignment:UITextAlignmentLeft fontName:@"Helvetica" fontSize:11];

// Bind texture
glBindTexture(GL_TEXTURE_2D, [statusTexture name]);

// Enable modes needed for drawing
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

// Draw
[statusTexture drawInRect:CGRectMake(X,Y-1,1,1)];   

// Disable modes so they don't interfere with other parts of the program
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);    
}

Je crois que coordonne l'entrée doivent être en coordonnées de votre monde, mais je ne suis pas sûr si cela est vrai en général ou si elle fonctionne de cette façon pour moi. Vous devrez peut-être jouer avec les compensations pour obtenir ce droit.

Merci pour cette méthode. Il m'a sauvé un certain temps.

Il y avait deux choses que je devais changer bien. L'appel glBlendFunc devait être:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA)

Et d'autre part, le texte semblait dessin en un seul point. L'appel CGRectMake crée un rectangle 1x1, à moins que je lis que de manière incorrecte.

Utilisez la bibliothèque de polices "de songeries":

http: / /www.themusingsofalostprogrammer.com/2010/01/how-to-do-font-rendering-in-opengl-on.html

Font font("Verdena");
font.print("Hello World!", x, y, z);

Facile:)

Il est livré avec un support unicode, charges « Glyphes sur la demande », et a même un moyen de variables de sortie

font.print(x, y, z) << "fps: " << fps;

J'ai créé une classe de police similaire à la bibliothèque de polices « de songeries », moins les fuites de mémoire et moins la création de texture pour chaque personnage, chaque image. Il utilise encore un autre glTexture pour chaque caractère bien. Remarque:. Texture2D a été modifié pour commenter sa suppression texture

init constructeur: _font = new Font("Helvetica", 40);

Utilisation procédé rafraîchissement (): _font->draw("Hello, World!", 50, 100, ALIGN_LEFT);

lien GitHub:

https://github.com/chandl34 / public / arbre / maître / personnel / c% 2B% 2B / Font

Vérifiez la démo d'atterrissage de l'accident. La classe Texture2D qui est fourni permet de créer des textures avec le texte et une police. (Il faut espérer qu'il y aura une meilleure réponse que j'aimerais une façon plus simple de dessin à une vue OpenGLES)

Oui, il y a 2 que je connais . L'astuce est, vous devez rendre à la texture en utilisant Quartz (* CGContext fonctions), puis rendre cette texture pour l'utilisateur de voir.

Si vous êtes préoccupé par la performance, vous pouvez également utiliser Quartz pour générer votre atlas de texture.

Il est assez facile à concocter un outil de génération de texture (dans Xcode) une fois que vous connaissez les bases de rendu de la police.

Tout ce que vous avez à faire est d'avoir un CGContext valide. Vous pouvez trouver quelques exemples de code vraiment super dans ce texture chargeur .

En gros le code passe:

// Create the cgcontext as shown by links above

// Now to render text into the cg context,
// the drop the raw data behind the cgcontext
// to opengl.  2 ways to do this:
// 1)  CG* way: (advantage: easy to use color)
CGContextSelectFont(cgContext, "Arial", 24, kCGEncodingMacRoman);

// set color to yellow text
CGContextSetRGBFillColor(cgContext, 1, 1, 0, 1) ; // Be sure to use FILL not stroke!

// draw it in there
CGContextShowTextAtPoint(cgContext, 20, 20, "HI THERE", strlen("HI THERE") ) ;

/*
// WAY #2:  this way it's always black and white
// DRAW SOME TEXT IN IT
// that works ok but let's try cg to control color
UIGraphicsPushContext(cgContext);
UIFont *helv = [UIFont fontWithName:@"Helvetica" size:[UIFont systemFontSize]];
NSString* msg = @"Hi hello" ;  
[msg drawInRect:CGRectMake(0,0,pow2Width,pow2Height) withFont:helv] ;
    UIGraphicsPopContext();
*/

// put imData into OpenGL's memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pow2Width, pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imData);
CHECK_GL ;

Il en sort à la recherche assez bonne et anticrénelage,

Atlas tex

Une liste des polices ios est ici , et retraduire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top