3 Stimmen

Erstellen eines "Blattes Papier mit Text" in OpenGL (speziell unter iOS 5)

Ich habe noch nie OpenGL getan, aber ich bin auf der Suche nach einigen Hinweisen auf diese spezielle Frage auf eine AR-App, die ich mit üben.

Ich möchte eine App mit einem "flachen Rechteck" und einem auf die Oberfläche des Rechtecks geschriebenen Text erstellen. Visuell stelle ich mir etwas vor, das einem Stück Papier mit darauf geschriebenem Text ähnelt. Jedes Mal, wenn die App startet, würde der Text etwas anderes sein (der Text wird aus einer plist-Datei gezogen).

Der Benutzer könnte das Papier von allen Seiten betrachten, so als würde ein Blatt Papier vor ihm liegen.

Ist dies trivial, in OpenGL zu tun? Wie könnte ich damit anfangen?

Entschuldigen Sie, dass die Frage so offen ist, aber ich wollte ein Gefühl dafür bekommen, wie so etwas gemacht wird.

Wenn ich mir den Quellcode der OpenGL-Vorlage in den Xcode-Beispielprojekten ansehe, sehe ich, dass es ein großes Array von Vertices gibt. Ich vermute, dass ein "flaches" Rechteck zu erstellen, würde ich im Wesentlichen nur zu entfernen oder machen die z-Achse Null. Und dann den dynamischen Text, der auf der Oberfläche des flachen Rechtecks befestigen wird ... Ich habe keine Ahnung, wie das zu tun ......

6voto

Damon Punkte 64271

Diese Frage ist schwer eindeutig zu beantworten. Im Allgemeinen ist sie trivial, aber dann auch wieder nicht.

Das Zeichnen eines "flachen Rechtecks mit etwas darauf" besteht aus ein paar API-Aufrufen, so einfach wie es nur geht. Zeichnen von Text in OpenGL auf effiziente Weise und in hoher Qualität und ohne große Vorverarbeitung ist eine ganz andere Geschichte.

Was ich tun würde, ist das Rendern von Text mit was auch immer das "normale System-unterstützte" Weg ist unter iOS (genau wie Sie in jedem Fenster zeichnen würde, würde ich dieses spezifische Detail nicht wissen), aber zeichnen in eine Bitmap und nicht auf dem Bildschirm. Dies sollte unterstützt werden, so gut wie jedes Betriebssystem unterstützt dies seit mindestens 10-15 Jahren. Dann verwandeln Sie diese Bitmap in eine Textur, binden Sie sie und zeichnen Sie Ihr triviales flaches Viereck mit OpenGL (richten Sie einen Vertex-Puffer mit 4 Scheitelpunkten ein, jeder Scheitelpunkt eine Texturkoordinate, und zeichnen Sie zwei Dreiecke - so einfach wie es geht).

Der große Vorteil dabei ist, dass Sie die installierten Systemschriften (oder beliebige andere verfügbare Schriften) verwenden können, keine Bitmap-Schriftarten erzeugen müssen und sich keine Gedanken über wirklich hässliche Dinge wie Hinting und korrekte Abstände machen müssen, und es ist viel einfacher, verschiedene Textstile zu mischen usw. OpenGL hat natürlich auch eine eingebaute Unterstützung für Text, aber die ist auch nicht besonders effizient oder schön. Wenn sich der Text nicht jede Millisekunde ändert, ist es wirklich am besten, ihn mit dem Standard-Renderer zu rendern, den das Betriebssystem zur Verfügung stellt (ja, das wird wahrscheinlich nicht hardwarebeschleunigt sein, aber was soll's... da der Benutzer den Text lesen muss, wird er sich wahrscheinlich nicht jede Millisekunde ändern).

Komplizierter wird es, wenn sich das "Stück Papier" nicht nur als flaches Rechteck, sondern auch noch biegen und verdrehen oder einen "Page-Peel-Effekt" erzeugen soll. In diesem Fall müssen Sie es tessellieren, was ebenfalls schwieriger sein kann, als es klingt. Nicht alle Tesselationen sehen für alle Biegungen und Verdrehungen optimal aus, oder sie sind optimal, haben aber nicht die optimale (d. h. minimale) Anzahl von Scheitelpunkten.

Es gibt einen Artikel über "Page Peel" und solche Tesselation in einem der GPU Gems oder GPU Pro Bücher, lassen Sie mich suchen...

Dort: Andreas Bizzotto: "A Shader-Based eBook Reader - Page peeling effect", GPU Pro2 pp. 278-299

Vielleicht können Sie ein Exemplar auftreiben oder haben das Glück, es bei Google Books oder ähnlichem zu finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X