Gibt es eine anständige OpenGL-Zeichnungsbibliothek für das iPhone SDK?

Ich versuche, einen einfachen Text in OpenGL zu zeichnen. Meine Forschung hat eine ziemlich komplexe Aufgabe gezeigt. Es beinhaltet das Erstellen (oder Erzeugen zur Laufzeit) einer Font-Atlas-Textur und das anschließende Erstellen eines Quads für jeden Buchstaben mit genau den richtigen Platzierungs- und Texturkoordinaten.

Ich habe einige gute Dinge über Freetype gehört, aber ich habe sehr wenig darüber herausgefunden, wie man es auf dem iPhone laufen lässt, und es scheint ziemlich komplex zu sein.

Gibt es also eine Objective-C-umhüllte OpenGL-Textbibliothek, die mit dem iPhone SDK funktioniert, das die Leute benutzt haben? Oder überlege ich das gerade und es gibt einen leichteren Ansatz, den ich vermisse?

Ihre Beschreibung der Verwendung von Freetype zum Erstellen eines Texturatlas zusammen mit allen Glyphinformationen ist genau das, was ich in meinem aktuellen iPhone-Projekt mache.

Ich mache das ganze Parsen der Schriftart in einem Vorverarbeitungsschritt (alles in C # auf Windows, wie es geschieht). Der Atlas selbst wird erzeugt und enthält nur die benötigten Zeichen – um Platz zu sparen, erschaffe ich manchmal auch mehr als einen einzelnen Atlas, um die Texturengrößen pow2 und eine vernünftige Auflösung zu halten.

Sie können die Glypheninformation aus Freetype leicht herausziehen. Übergeben Sie diese zur Laufzeit zusammen mit den Texturen an Ihre App, und dann ist es ziemlich einfach, die UV-Koordinaten der Textur nach Bedarf zu ändern.

Für das, was es wert ist, definiere ich einen Glyphencharakter in meiner kleinen Engine:

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 sich ziemlich wie jede andere Zeichenfolge verhält, abgesehen davon, dass ich es mit Sprites zeichnen kann ….

Ich stimme zu, dass alles wie ein großer Job für ein ziemlich triviales Problem aussieht, aber ich habe festgestellt, dass es mir viel Flexibilität gegeben hat und wirklich nicht lange gebraucht hat, um es umzusetzen, als ich mich daran gewöhnt habe.

Fühlen Sie sich frei zu antworten oder zu kommentieren, wenn Sie weitere Informationen benötigen. (Und viel Glück 🙂


Antworte auf deinen Kommentar, da ich im Kommentarbereich keinen Platz mehr habe …

Schau dir die Freetype-Dokumentation an, es gibt dir im Grunde die Glyph-Daten, ohne herumzuspielen, es zieht es einfach aus der Schriftart heraus. Wie für die Texturen selbst, erhalten Sie Freetype, um jedes Glyph zu rendern, und verwalten Sie dann, um die Textur zu erstellen. Dies mache ich als Vorprozess komplett getrennt von meiner Haupt-App.

Hier ist ein Auszug aus meinem Tool-Code, der dies tut: http://pastebin.com/md1c6354

Bitte beachten Sie, dass dies nur für meine Augen und nicht für den öffentlichen Verbrauch gedacht war, also entschuldigen Sie die Tatsache, dass es chaotisch ist 🙂

Eine Möglichkeit besteht darin, ein UILabel einzurichten und dann seine Ebene in eine Textur zu rendern. Ein indirekter Weg dahin wäre, zuerst das UILabel mit Text, Font usw. einzurichten und dann den folgenden Code zu verwenden

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

das UILabel zu einem UImage zu erfassen. Sie könnten dann den initWithImage: -Konstruktor der Texture2D-class im CrashLanding-Projekt verwenden, um dies in eine Textur umzuwandeln.

Es sieht wie initWithImage aus: In diesem Beispiel wird das UIImage-Objekt in einen Bitmap-Kontext gerendert und zum Erstellen der Textur verwendet. Mit ein wenig Arbeit könnten Sie den relevanten Code aus dieser Methode extrahieren und den obigen Code ändern, um Ihre Ebene direkt in die Textur zu rendern.

Auf diese Weise erhalten Sie die nette Unicode- und Zeichensatzunterstützung von UILabel, wenn Sie den Text für Ihre Textur erstellen.

Ich habe eine einfache Lösung gefunden. Hier ist eine kurze function, die ich dafür geschrieben habe. (Sie benötigen die Texture2D-class.)

 - (void) drawText:(NSString*)theString AtX:(float)XY:(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, dass die Eingabekoordinaten in Ihren Weltkoordinaten sein müssen, aber ich bin mir nicht sicher, ob das überhaupt stimmt oder ob es für mich einfach so funktioniert. Sie müssen möglicherweise mit den Offsets spielen, um es richtig zu machen.

Danke für diese Methode. Es hat mir etwas Zeit gespart.

Es gab ein paar Dinge, die ich ändern musste. Der Aufruf von glBlendFunc muss folgendermaßen lauten:

 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA) 

Und zweitens schien der Text zu einem einzigen Punkt zu merge. Der CGRectMake-Aufruf erstellt ein 1×1-Rechteck, es sei denn, ich lese das falsch.

Verwenden Sie die Schriftbibliothek “musings”:

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

Einfach 🙂

Es kommt mit Unicode-Unterstützung, lädt Glyphen “on-demand” und hat sogar eine Möglichkeit, Variablen auszugeben

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

Ich habe eine Font-class erstellt, die der “musings” -Fontbibliothek ähnelt, abzüglich der Speicherlecks und abzüglich der Texturerstellung für jedes Zeichen, jeden Frame. Es verwendet jedoch immer noch eine andere glTexture für jedes Zeichen. Hinweis: Texture2D wurde geändert, um seine Texturlöschung zu kommentieren.

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

Verwenden Sie in redraw () Methode: _font->draw("Hello, World!", 50, 100, ALIGN_LEFT);

GitHub-Link:

https://github.com/chandl34/public/tree/master/personal/c%2B%2B/Font

Überprüfen Sie die Demo der Absturzlandung. Die bereitgestellte Texture2D-class ermöglicht das Erstellen von Texturen mit Text und einer Schriftart. (Hoffentlich gibt es eine bessere Antwort. Ich würde gerne einen einfacheren Weg zu einer offenen Perspektive ziehen)

Ja, es gibt 2, die ich kenne . Der Trick ist, dass Sie die Textur mit Quartz (CGContext * -functionen) rendern und dann diese Textur für den Benutzer anzeigen lassen müssen.

Wenn Sie sich Sorgen um die performance machen, können Sie mit Quartz auch Ihren Texturatlas erstellen.

Es ist ziemlich einfach, ein Texturgenerierungstool (in xCode) zu erstellen, sobald Sie die Grundlagen zum Rendern einer Schriftart kennen .

Alles, was Sie tun müssen, ist einen gültigen CGContext. Sie können einige wirklich gute Beispielcode in diesem Texturlader finden .

Grundsätzlich geht der Code:

 // 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 sieht ziemlich gut und antialiased aus,

Texatlas

Eine Liste von Ios-Fonts ist hier verfügbar , und mit Prerendern hier