Niezależny tekst rozdzielczości renderowania

11

Potrzebuję sposobu na narysowanie niezależnego tekstu w mojej grze. Oznacza to, że muszę móc powiększać tekst i nigdy nie widzieć artefaktów pikseli.

Czy ktoś może zasugerować, jak to zrobić?

Mikrofon
źródło
Zakładam, że musisz przyjrzeć się metodom czcionek wektorowych, a nie czcionek zrasteryzowanych, co może być punktem wyjścia. Nie jestem ekspertem w tej sprawie, więc dam komuś, kto znałby odpowiedź.
Ray Dey,

Odpowiedzi:

7

Istnieją trzy typowe sposoby, aby to zrobić. Tak naprawdę nie chodzi o całkowitą eliminację artefaktów - co jest niemożliwe, chyba że masz nieograniczoną pamięć lub czas procesora - ale raczej o to, jak je zminimalizować w sposób zgodny z istniejącym kodem i platformami docelowymi.

Po pierwsze, użyj rasteryzatora czcionek - zwykle FreeType - aby zrasteryzować czcionkę w żądanym rozmiarze podczas powiększania. Będzie to wyglądać świetnie na zrzutach ekranu, ale jest niewiarygodnie wolne. Możesz rozwiązać spowolnienie, buforując rozmiary, ale wtedy staje się on niezwykle głodny pamięci. Nie wygląda też świetnie w ruchu, ponieważ poprawienie wyglądu glifów do wyświetlania statycznego wymaga nierównomiernego skalowania. Jest to jednak opcja, jeśli jesteś na platformie z wystarczającą ilością pamięci (jak komputer), a Twoje wagi są ograniczone do pewnego małego zakresu, na przykład od 10px do 30px. Ta metoda sama w sobie nie dopuszcza zbyt wiele słodyczy.

Po drugie, możesz przechowywać swój tekst jako siatkę. Istnieją biblioteki, które to robią, na przykład GLTT , lub możesz napisać własną. Teraz nie masz już artefaktów pikselowych, ale będziesz mieć artefakty wielokątne, jeśli powiększysz je bardzo blisko - tak jak każda inna siatka w grze 3D. Tekst siatki ma wiele uroku, ponieważ można stosować moduły cieniujące wierzchołki, a siatkę można przeplatać z dowolnym innym rysunkiem świata. Jest dość lekki w stosunku do pamięci i procesora oraz łatwy do zmierzenia koszt, ponieważ jest to tylko standardowa siatka. Integracja z normalnym potokiem renderowania 2D opartym na ikonce może być uciążliwa.

Po trzecie, możesz użyć pól odległości w połączeniu z shaderem pikseli . Jest to stosunkowo nowa technika, która jest obecnie popularna, używając prostego modułu cieniującego do próbkowania gotowej tekstury i „darmowego” dwuliniowego filtrowania karty graficznej w celu czystego skalowania glifów. Zużywa niewiele i łatwo przewidywalną pamięć w porównaniu do innych metod - teksturę od 0,5 MB do 1 MB na zestaw znaków na czcionkę. Ładnie pasuje do rurociągów renderujących opartych na ikonkach, ponieważ jest oparty na ikonkach; każdy glif jest wciąż teksturowanym quadem. Wytwarza artefakty pikseli, ale bardzo niewiele w porównaniu z innymi metodami skalującymi tekstury. Istnieje również awaria funkcji stałej, jeśli moduły cieniujące są niedostępne, ale tekst jest bardzo aliasowany. Ponieważ próbkowanie odbywa się za pomocą modułu cieniującego piksele, pozwala na tanie cukierki, takie jak konspekty i cieniowanie.


źródło
3

Istnieje również artykuł badawczy firmy Microsoft Research autorstwa Loop i Blinn na temat renderowania niezależnych od rozdzielczości krzywych za pomocą shaderów. Sugeruje użycie przedstawionej techniki do renderowania tekstu TrueType w sposób niezależny od rozdzielczości.

macbirdie
źródło
1

Musisz zbudować znaki czcionki z kombinacji krzywych i linii, które następnie przekształcisz w geometrię z odpowiednim poziomem szczegółowości w czasie wykonywania.

Na szczęście większość czcionek jest już zbudowana z krzywych Beziera. Aby uzyskać dane krzywej, wystarczy użyć standardowej funkcji Windows GetGlyphOutline (), aby je wyodrębnić.

Nie jestem pewien, czy możesz uzyskać te dane krzywej z C # bez PInvoke.

Adam
źródło
1
Aby zrobić to na wiele platform i nie martwić się o rzeczy PInvoke, wydaje mi się, że byłbyś w stanie napisać narzędzie do zrzutu danych, które GetGlyphOutline czyta (patrz to pytanie SO ) do jakiegoś niestandardowego formatu, a następnie kilka prostych we / wy pliku w kodzie gry, aby po prostu załadować niestandardowe dane glifów.
Ricket
0

Możesz rzucić okiem na freetype. Nie mam pojęcia, czy jest on dostępny na Twojej platformie, czy ma zastosowanie licencja, ale jest to raczej doskonała biblioteka typu open source do renderowania czcionek rzeczywistych i innych czcionek wektorowych. Uważam, że musieli zrobić sprytnego prawnika unikającego kodu, aby czcionki były renderowane w estetyczny sposób. Prawdziwy sposób obejmuje kody bajtowe na krzywych w celu zapewnienia wskazówek do mechanizmu renderującego, dzięki czemu ważne funkcje czcionek (takie jak pionowe i szeryfowe) nie zostaną zamazane, tak jak w przypadku standardowego naiwnego wygładzania. Ta technika ma na to patent, więc ludzie z wolnego rodzaju musieli wymyślić coś innego, co wykonało pracę i nie powołało się na straszną bestię-prawnika (chyba) Apple. W każdym razie, odkładając na bok prawne, spróbuj spojrzeć na freetypehttp://freetype.sourceforge.net/index2.html

Luther
źródło