Preferowany sposób renderowania tekstu w OpenGL [zamknięty]

17

Zaraz znów podniosę grafikę komputerową do projektu uniwersyteckiego. W poprzednim projekcie korzystałem z biblioteki o nazwie FTGL, która nie pozostawiła mnie do końca zadowolonego, ponieważ wydawało mi się to trochę ciężkie (próbowałem wielu technik renderowania, renderowanie tekstu nie skalowało się zbyt dobrze).

Moje pytanie brzmi, czy jest do tego dobra i wydajna biblioteka? Jeśli nie, w jaki sposób można wdrożyć szybki, ale ładnie wyglądający tekst? Niektóre zamierzone zastosowania to:

  • Pływające etykiety obiektów / znaków
  • Dialogi
  • Menu
  • HUD

EDYCJA: Najlepiej może również ładować czcionki

dukeofgaming
źródło
1
Jest to „pytanie, którą technologię zastosować” i dlatego prawdopodobnie powinno zostać zamknięte.
Laurent Couvidou,

Odpowiedzi:

4

Popularnym frameworkiem jest GUI Crazy Eddie .

Ale choć jest to atrakcyjne, nie jest niczym niezwykłym, aby rzucić własne (i być może żałuję, gdy zasięg wzrośnie później;))

To normalne, że masz glify na bitmapach, a następnie rysujesz je za pomocą OpenGL.

Czasami wyświetla się tekst przejściowy, który może pojawiać się tylko w przypadku kilku ramek. Wystarczy użyć GL_QUADS + glVertex. Ale dla każdej dużej ilości tekstu lub długiego czasu widoczności warto umieścić GL_QUADS w VBO - zauważyłem z tego dużą poprawę wydajności.

Oczywiście istnieje kwestia generowania potrzebnych glifów. Istnieją programy takie jak BMFont , których można użyć do tego. Lub może być konieczne bardziej skomplikowane renderowanie, np. Freetype na żądanie. Korzystam z bmfonta z moim własnym rendererem całkiem szczęśliwie, to bardzo łatwo wydedukować.

Wola
źródło
9

Istnieje wiele sposobów - w zależności od tego, czego chcesz ... Tak jak wszędzie, nie ma czegoś takiego jak „najlepsze rozwiązanie”. Która platforma jest Twoim celem? Jakiego języka używasz? Co dotyczy zmiany rozmiaru / obrotu tekstu - czy jest to konieczne? Czy musisz być w stanie renderować TrueTypeFonts? Co o Multilanguage / Unicode? Jak chcesz przechowywać swój tekst (które kodowanie itp.)?

W przeszłości używałem także FTGL, a także czystego freetype (http://www.freetype.org/ FTGL jest na tym oparty), różnego rodzaju czcionek bitmapowych, czcionek konturowych ... Teraz jestem uzależniony od bitmapy czcionki, ale to tylko moje osobiste preferencje. Ponieważ nie chcę już zajmować się różnymi zestawami znaków, kodowaniem itp. - a licencjonowanie bitmapfontów jest również łatwiejsze i tańsze niż w przypadku TrueTypeFonts. I jest użyteczny na każdej platformie, która może ładować obrazy. Używam po prostu quada w openGL i mapuję na nim część mojej tekstury. Druga strona to: rozmiar czcionki będzie się zmieniał tylko przy współczynniku około +/- 50%. Jeśli możesz z tym żyć, sugerowałbym użycie mapy bitowej.

Jeśli masz również do czynienia z różnymi kodowaniami / zestawami znaków, powinieneś znaleźć sposób na załadowanie i użycie TrueTypeFonts (np. Z freetype, przy użyciu innej biblioteki lub z własną implementacją) ...

Zobacz także różne tutoriale na ten temat:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Czcionki bitmapowe

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Czcionki konturowe

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Czcionki konturowe odwzorowane na teksturę

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Czcionka tekstury 2D

Powodzenia!

Constantin
źródło
+1 Dzięki za cenne informacje na temat wydajności, wiedziałem o tutorialach NeHe. Wydaje mi się, że użyłem czcionek bitmapowych ... ale nie skalowało się: około 60 etykiet unoszących się w scenie ponad kulami połączonych liniami, jakaś wiedza na ten temat? (Myślałem, że powinienem był poszukać sposobu na wdrożenie wzorca
masy ciała
1
Uwaga: samouczki NeHe dotyczą starego potoku funkcji stałych i nie są często aktualizowane. Jeśli szukasz nowoczesnego rozwiązania OpenGL, zobacz stackoverflow.com/questions/5262951/...
brita_
6

Jeśli chcesz używać czcionek bitmapowych, nie możesz się pomylić z generatorem czcionek bitmapowych Angelcode: http://www.angelcode.com/products/bmfont/

Konwertuje czcionkę truetype na jedną lub więcej tekstur (z ładnie spakowanymi glifami) i generuje mały plik zawierający UV i odstępy (uważam, że wyjście XML jest szczególnie łatwe w obsłudze, a jakość danych odstępów jest ogólnie bardzo dobre, nawet bez prawdziwego kerningu)

bluescrn
źródło
1

Korzystam z bibliotek Seana Barreta do renderowania glifów truetype w OpenGL (stb_image, stb_truetype).

Projekt Recast / Detour używa tych bibliotek do stworzenia interfejsu użytkownika ( IMUI )

Marco Schmidt
źródło
0

Rozważ QML . Jest to w pełni funkcjonalna biblioteka interfejsu użytkownika z łatwą w użyciu składnią. Z mojego doświadczenia wynika, że ​​jego zestaw funkcji jest znacznie lepszy niż CEGUI, ma lepszą dokumentację, wsparcie i społeczność, ponieważ jego głównym celem są aplikacje komputerowe, a możliwość renderowania poza ekranem to po prostu bonus.

Plusy:

  • Do renderowania używa OpenGL na zapleczu
  • Może ładować dowolną czcionkę dostępną dla systemu hosta, a także analizować dodatkowe czcionki dołączane jako zasoby
  • Wykorzystuje renderowanie podpisanego pola odległości w celu uzyskania wydajnego i wysokiej jakości wydruku
  • Może renderować bezpośrednio do tekstury OpenGL, dzięki czemu można łatwo umieszczać wyniki w środowisku gry
  • Qt ma wiele powiązań językowych

Cons:

  • Qt to duży framework
  • Używanie QML w projektach Direct3D lub Vulkan wymaga przeskakiwania przez obręcze, aby uzyskać teksturę GL do odpowiedniego API (lub czekania, aż ktoś napisze natywne renderery D3D / Vulkan dla QML)
  • W QML wciąż występują pewne drobne dziwactwa, w których spróbuje użyć natywnego kontrolki, nawet jeśli renderujesz na powierzchnię poza ekranem, na przykład podczas próby otwarcia listy rozwijanej dla elementu listy.
Jherico
źródło