2012-08-01 12 views
12

Używam PowerVR OpenGL ES 2 SDK do rozwijania mojej gry w systemie Windows z C++, a następnie mogę przenieść ją do Androida lub iPhone'a.Poprawny sposób rysowania tekstu w OpenGL ES 2

Wszystko wygląda dobrze, ale utknąłem z renderowaniem tekstu. Nie mogę znaleźć żadnego szczegółowego samouczka dotyczącego renderowania tekstu (przy użyciu TTF lub czcionki bitmapowej) w OpenGL ES 2.0 przy użyciu C++. Znalazłem wiele tematów mówiących o renderowaniu tekstu na Androidzie lub iPodzie przy użyciu java lub object-c (z textview, surfaceview lub kilkoma blah blah rzeczy), ale nie sądzę, że to jest to, czego potrzebuję. Potrzebuję "rozwiązania wieloplatformowego". (Lub może się mylę w tym momencie?)

Po trochę badań, mam rozwiązanie w moim umyśle:

obciążenia i wiążą bitmap font tekstury ->Parse tekstu i generowanie i wiążą tablica wierzchołki, mapowanie tekstur z tablicy UV ... ->uczynić go do ekranu

nie mam jeszcze testowany, ale myślę, że jest to problem przy korzystaniu moje rozwiązanie: kiedy chcę zmienić tekst (przykład: Robię wynik użytkownika lub timer na ekranie) Muszę ponownie powiązać tablicę vertice i tablicę uv, to nie jest dobry pomysł, prawda?

Czy istnieje lepszy sposób/właściwy sposób narysowania czcionki bitmapowej na ekranie za pomocą OpenGL ES 2?

Odpowiedz

2

renderowanie tekstu jest jednym z tematów, przed którymi większość nowych osób musi stawić czoła wcześniej lub później w świecie bibliotek 3D.

Istnieje wiele tutoriali w Internecie na temat renderowania tekstu, wiele książek mówi o tym. Moja rada to rozejrzeć się i spróbować zrozumieć, jak działają.

Czcionki TTF nie są realnym rozwiązaniem, ponieważ w scenariuszu obliczeniowym w czasie rzeczywistym (takim jak gra komputerowa) technika TTF oparta na geometrii jest zdecydowanie zbyt kosztowna.

Bardzo powszechnym rozwiązaniem (używanym na przykład w moim silniku 3D PATRIA) jest użycie atlasu tekstury zawierającego glif różnych znaków, a następnie logika aplikacji musi obsługiwać tekst -> relacja położenia glifu do teksturowania quadów, które skomponują końcowy "tekst na ekranie".

renderowania Tekst nie jest prosty temat, ponieważ obejmuje tematy jak kerningu/rozstaw/różnej wielkości tekstu itp

Spróbuj ten link, aby jak najlepiej zrozumieć temat (jeśli się nie mylę, autor tego wiki jest aktywnym członkiem tej społeczności).

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

4

Rozwiązanie, które można wymienić jest droga, i rzeczywiście, jeśli zmodyfikować tekst, musisz odtworzyć geometrię reprezentującą go i ponownie zgłosić je do OpenGL.

Ten krok rekreacyjny zajmie trochę czasu, ale z pewnością nie będzie zbyt duży.

do renderowania tekstu, problem ma dwa główne składniki:

  • stworzyć swój tekstury atlas bitmap
  • rysować tekstu przy użyciu tej faktury, z uwzględnieniem parametrów czcionki (rozmiar, kerning, etc.) I ewentualnie subpiksel antyaliasingu

Aby tworzyć tekstury atlas, można znaleźć jakiś kod wokół (prawdopodobnie za pomocą FreeType) lub użyć istniejącego narzędzia (takie jak AngleCode's bmfont).

Do rysowania prawdopodobnie będziesz chciał wprowadzić własny kod, oparty na istniejącym kodzie, ponieważ jest wiele szczegółów, które pozwolą uzyskać dobrze wyglądający tekst. Aby zacząć ból głowy, możesz rzucić okiem na this article.

Jednym z dobrych współczesnych źródeł inspiracji może być kod Nicolas Rougier's freetype-gl.

+0

Czy ktoś ma przykład OpenGL ES 2.0 Android obsługujący rotację? – Burf2000

0

Właściwym sposobem rysowania tekstu w grze jest użycie tekstur atlasy z glifów zawierające pola Dystans: https://www.mapbox.com/blog/text-signed-distance-fields/

także zobaczyć ten papier SIGGRAPH od zaworu (Twórcy Half-Life i Portal) opisujących odmiany technika: http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Jakość tekstu zależna od pola jest znacznie wyższa niż tekst oparty na zwykłej bitmapie. Wykorzystuje również mniej pamięci, ponieważ pole odległości jest mniejsze niż dosłowną reprezentację czcionki bitmapowej.