Frage

Ich versuche, einen einfachen, um herauszufinden, um einen Text in OpenGL zu zeichnen. Meine Forschung hat sich eine ziemlich komplexe Aufgabe gezeigt. Es geht um die Schaffung (oder Erzeugung zur Laufzeit) eine Schriftart Atlas Textur, und dann einen Quad für jeden Buchstaben mit genau den richtigen Platzierung und Texturkoordinaten zu schaffen.

Ich habe einige gute Dinge über Freetype gehört, haben aber sehr wenig darüber, wie gefunden, um es auf dem iPhone laufen, und es scheint ziemlich komplex zu sein.

So ist es ein Objective-C OpenGL Textbibliothek eingewickelt, die mit dem iPhone SDK arbeitet, dass die Menschen verwendet haben? Oder bin ich nur darüber nachzudenken und es gibt einen einfacheren Ansatz, dass ich fehle?

War es hilfreich?

Lösung

Ihre Beschreibung der Verwendung von Freetype zusammen mit allen Glyphe Informationen einen Texturatlas zu erstellen, ist genau das, was ich in meinem aktuellen iPhone-Projekt mache.

ich alles tun, die Analyse der Schrift in einem Vorprozess Schritt (alle in C # unter Windows, wie es geschieht). Der Atlas selbst erzeugt wird und enthält nur die Zeichen benötigt - auf Platz zu reduzieren, habe ich manchmal auch mehr als einen einzigen Atlas Erzeugung am Ende Texturen zu halten Größen POW2 und einer vernünftigen Auflösung.

Sie können ganz einfach die Glyphe Informationen von Freetype herausziehen. Übergeben Sie, dass zusammen, um Ihre Anwendung zusammen mit den Texturen zur Laufzeit und es ist dann ziemlich trivial, nur die UV-Koordinaten der Textur zu ändern, wie erforderlich.

Für das, was es wert ist, das ist, wie definiere ich einen Glyphe Charakter in meinem kleinen Motor:

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?

};

Ich habe dann ein ‚SpriteString‘ Objekt, das ist ziemlich viel wie jede andere Saite verhält, außer ich es mit Sprites ziehen kann ....

Ich bin damit einverstanden das alles wie eine große Aufgabe für ein ziemlich triviales Problem scheinen mag, aber ich gefunden habe es mir gegeben viel Flexibilität und wirklich dauerte nicht so lange zu implementieren, wenn ich es nach unten bekam.

Fühlen Sie sich frei, um zu antworten oder einen Kommentar, wenn Sie weitere Details benötigen. (Und viel Glück:)


Ihren Kommentar antworten, wie ich aus dem Zimmer im Kommentarbereich lief ...

Überprüfen Sie die Dokumentation aus Freetype, es gibt Ihnen grundsätzlich die Glyphe-Daten ohne Flickschusterei, es zieht es nur direkt aus der Schrift. Was die Texturen selbst, erhalten Sie freetype jede Glyphe zu machen, und dann das schaffen die Textur zu bauen. Dies tue ich als Pre-Prozess völlig getrennt von meinem Haupt-App.

Hier ist ein Auszug aus meinem Werkzeugcode, das dies tut: http://pastebin.com/md1c6354

obwohl

Bitte beachten Sie, wurde dies immer nur die für meine Augen und nicht für die Öffentlichkeit, so entschuldigen Sie die Tatsache, es ist chaotisch wie die Hölle:)

Andere Tipps

Eine Möglichkeit, dies zu tun ist durch einen UILabel Einrichtung und dann seine Schicht in eine Textur-Rendering. Eine indirekte Route dies wäre zuerst die UILabel mit Text, Schriftart, usw. einrichten und verwenden Sie dann den folgenden Code

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

die UILabel auf ein UIImage zu erfassen. Sie könnten dann die initWithImage benutzen. Konstruktor der Texture2D Klasse im CrashLanding Projekt dies zu einer Textur zu verwandeln

Es sieht aus wie initWithImage: In diesem Beispiel wieder macht die UIImage in einem Bitmap-Kontext und verwendet diese die Textur zu erstellen. Mit einer wenig Arbeit, können Sie den entsprechenden Code aus diesem Verfahren extrahieren und den obigen Code ändern Sie Ihre Schicht direkt in die Textur zu machen.

Auf diese Weise erhalten Sie die schöne Unicode und Font-Unterstützung von UILabel, wenn Sie den Text für Ihre Textur zu schaffen.

fand ich eine einfache Lösung für dieses. Hier ist eine schnelle Funktion, die ich für sie geschrieben hat. (Sie werden die Texture2D Klasse benötigen.)

- (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);    
}

Ich glaube, die Eingabekoordinaten sein müssen, in deiner Welt koordiniert, aber ich bin nicht sicher, ob das in der Regel wahr ist oder ob es funktioniert einfach so für mich. Möglicherweise müssen Sie mit den Offsets spielen es richtig zu machen.

Danke für diese Methode. Es ersparte mir etwas Zeit.

Es gab ein paar Dinge, die ich allerdings ändern musste. Der glBlendFunc Aufruf benötigt werden:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA)

Und zweitens, erschien der Text in einen einzigen Punkt zu zeichnen. Der CGRectMake Anruf wird ein 1x1 Rechteck erstellen, es sei denn, ich falsch bin zu lesen.

Mit der "Träumereien" font-Bibliothek:

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);

Ganz einfach:)

Es kommt mit Unicode-Unterstützung, lädt Glyphen „on-demand“ und hat sogar einen Weg, um Ausgangsgrößen

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

Ich habe eine Font-Klasse ähnlich wie die „Überlegungen“ font-Bibliothek erstellt, minus die Speicherlecks und minus die Textur-Erstellung für jeden Charakter, jeden Rahmen. Es nutzt noch eine andere glTexture für jeden obwohl Charakter. Hinweis:. Texture2D wurde geändert, seine Textur Löschung auszukommen

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

Verwendung in Neuzeichnung () -Methode: _font->draw("Hello, World!", 50, 100, ALIGN_LEFT);

GitHub Link:

https://github.com/chandl34 / public / Baum / Master / personal / c% 2B% 2B / Font

Überprüfen Sie die Bruchlandung Demo. Die Texture2D Klasse, die vorgesehen ist, ermöglicht die Erzeugung von Texturen mit Text und einer Schriftart. (Hoffentlich wird es eine bessere Antwort ist Ich würde gerne einen einfacheren Weg zu einer OpenGLES Ansicht Zeichnung)

Ja, es gibt 2, die ich kenne . Der Trick ist, müssen Sie machen mit Quartz (CGContext * Funktionen) texturieren, dann diese Textur machen für den Benutzer zu sehen.

Wenn Sie über die Leistung besorgt sind, können Sie auch Quarz verwenden, um Ihren Texturatlas zu erzeugen.

Es ist ziemlich einfach, ein Textur-Generierungs-Tool (in xCode) wenn Sie wissen, die Grundlagen der eine Schriftart zu machen.

Alles, was Sie tun müssen, ist eine gültige CGContext haben. Sie können einige wirklich große Beispielcode in dieser finden Textur loader .

Grundsätzlich ist der Code geht:

// 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 ;

Es kommt heraus, sieht ziemlich gut aus und antialiased,

tex Atlas

Eine Liste von ios Schriftart ist hier zur Verfügung, und mit prerenders hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top