Pytanie Prawidłowy sposób narysowania tekstu w OpenGL ES 2


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

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 jestem w tym punkcie w błędzie?)

Po niewielkich badaniach, mam rozwiązanie w mojej głowie:

Załaduj i połącz teksturę czcionek bitmapowych -> Przetwarzaj tekst i generuj i binduj tablice wierzchołków, odwzorowuj teksturę z tablicą UV, ... -> Renderuj go na ekranie

Nie jestem jeszcze przetestowany, ale myślę, że jest to problem przy korzystaniu z mojego rozwiązania: Kiedy chcę zmienić tekst (na przykład: robię wynik użytkownika lub timer na ekranie) muszę ponownie związać tablicę wierzchołków i uv tablica, 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?


12
2017-08-01 02:15


pochodzenie




Odpowiedzi:


Rozwiązanie, o którym wspomniałeś, jest drogą do zrobienia, a nawet jeśli zmodyfikujesz swój tekst, będziesz musiał odtworzyć geometrię, która go reprezentuje, i ponownie przesłać go do OpenGL.

Ten etap rekreacyjny zajmie trochę czasu, ale z pewnością nie będzie zbytnio.

Do renderowania tekstu problem składa się z dwóch głównych elementów:

  • utwórz mapę bitową atlasu tekstury
  • narysuj tekst za pomocą tej tekstury, biorąc pod uwagę metryki czcionki (rozmiar, kerning itp.) i ewentualnie antyaliasing subpiksela

Aby stworzyć atlas tekstury, możesz znaleźć trochę kodu (prawdopodobnie używając freetype) lub użyć istniejącego narzędzia (np Bmfont użytkownika AngleCode).

W przypadku 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 Ten artykuł.

Dobrym nowoczesnym źródłem inspiracji może być Nicole Rougier's freetype-gl kod.


4
2017-08-03 09:37



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


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

W Internecie jest dużo tutoriali 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 popularnym rozwiązaniem (takim, którego używam na przykład w moim silniku PATRIA 3D) jest użycie atlasu tekstury zawierającego glif różnych znaków, a następnie logika aplikacji musi obsłużyć tekst -> zależność pozycji glifu dla teksturowania quady, które skomponują ostateczny "tekst na ekranie".

Renderowanie tekstu nie jest prostym tematem, ponieważ obejmuje tematy takie jak kerning / spacing / inny rozmiar tekstu itp.

Staraj się podążać za tym linkiem, aby lepiej zrozumieć temat (jeśli się nie mylę, autor tej wiki jest aktywnym członkiem tej społeczności).

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


2
2017-08-03 07:12





Właściwym sposobem narysowania tekstu w grze jest użycie atlasów tekstur z glifami zawierającymi pola odległości: https://www.mapbox.com/blog/text-signed-distance-fields/

Zobacz także artykuł Siggraph z Valve (twórcy Half-Life i Portal) opisujący wariacje techniki: http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Jakość tekstu w oparciu o pole odległości 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.


0
2017-12-07 20:07