Autor Wątek: [OpenGL] Wyświetlenie fontów w interkach 4kb  (Przeczytany 653 razy)

Offline slowbro

  • Użytkownik

# Czerwiec 14, 2017, 00:35:12
Cześć

Wiecie może w jaki sposób w interku 4kb najlepiej zrobić wyświetlanie fontów 2D, aby wszystko zajmowało jak najmniej miejsca bez wykorzystania GLUTa czy shaderów? Potrzebuje tylko wyświetlić tekst bez wykonywania operacji na nim typu obracanie, oddalanie czy przybliżanie. Potrzebuje jakoś "zainkludować" fonty do intra 4kb. Można plik bitmapowy z czcionkami przerobić jakoś na tablice z danymi i potem zainkludować ją i jakoś fonty wykorzystać w intrze?

Pozdro








« Ostatnia zmiana: Czerwiec 14, 2017, 00:51:14 wysłana przez slowbro »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Brajanowski

  • Użytkownik

# Czerwiec 14, 2017, 16:11:52
Możesz bitmape na tablice w C przerobić w gimpie, następnie wpisać ręcznie pozycje glyphów i potem renderować standardowo.

(uwaga, to jest post typu nie znam się wypowiem, wpadł mi taki pomysł do głowy więc się podzieliłem; polecam poczekać aż ktoś bardziej doświadczony się wypowie :) )

Offline ChristopherTa...

  • Użytkownik

# Czerwiec 14, 2017, 22:38:38
Jak najmniej miejsca? Możesz wykorzystać bitmapy (dosłownie!) i mieć litery tak jak w trybie tekstowym, gdzie glif 8x16 czcionki zajmuje 16 byte'ów (czyli każdy pixel zajmuje bit). Np. 'A':

byte:   grafika:
        01234567
0x00  0 ........
0x00  1 ........
0x00  2 ........
0x38  3 ..###...
0x6C  4 .##.##..
0xC6  5 ##...##.
0xC6  6 ##...##.
0xFE  7 #######.
0xC6  8 ##...##.
0xC6  9 ##...##.
0xC6  a ##...##.
0x00  b ........
0x00  c ........
0x00  d ........
0x00  e ........

Powyższe możesz zredukować do 8 byte'ów: bo można pominąć pierwsze 3 i 4 ostatnie byte'y o wartości 0 i, jak każda inna duża litera i cyfra, 'A' ma taką samą wysokość więc i te w/w w 8 byte'ach się zmieszczą, a małe litery będą potrzebować 10 (bo wysokości są różne), lub można też napisać dodatkowy byte z wartością offsetu górnego i liczby lini do rysowania dla małych liter czy znaków interpunkcji. Np. 'a':

byte dodatkowy:

0x56 (w rzeczywistości: offset 5 lini i 6 byte'ów do rysowania)

0x78  5 .####...
0x0C  6 ....##..
0x7C  7 .#####..
0xCC  8 ##..##..
0xCC  9 ##..##..
0x7E  a .######.

Podsumowując dla dużych liter i cyfr: 8 byte'ów, dla małych: 10, lub: byte-nagłówek i odpowiednia liczba byte'ow na wypełnienie. Następnie wszystkie potrzebne dane znaków (poprzedzone dodatkowym byte'm-nagłówkiem typu: 'A' i dane dla 'A') umieścić w kolejności ASCII (dla szybszego dekodowania symboli) w dużej tabeli byte'owych elementów i na podstawie tego tworzyć teksturę i atlas glifów dopiero podczas działania programu.

Z poważaniem.
Krzysztof.
« Ostatnia zmiana: Czerwiec 14, 2017, 22:55:55 wysłana przez ChristopherTaivaus »

Offline Mergul

  • Użytkownik

# Czerwiec 15, 2017, 00:48:57
Jeźeli uźywasz starego OGL albo w profiku kompatybilnym to jest nawet funkcje glBitmap do rysowania bitmap (tzn. to co napisał Krzysztof, 8 pixeli na bajt)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Czerwiec 21, 2017, 23:22:05
Może dałoby się użyć czcionek systemowych za pomocą funkcji WinAPI? Wtedy nie trzeba pakować do intra żadnych danych, jedynie trochę kodu. CreateFont, HDC itp...

Offline slowbro

  • Użytkownik

# Czerwiec 22, 2017, 23:00:18
Dziękuję wszystkim za wskazówki. Może komuś się przydadzą linki:

- wykorzystanie systemowych fontów: http://nehe.gamedev.net/tutorial/bitmap_fonts/17002/
- wykorzystanie fontów utworzonych za pomocą tablic z danymi:http://cpp0x.pl/kursy/Kurs-OpenGL-C++/Mapy-bitowe/223

Pierwsze rozwiązanie jest najmniej eleganckie, ale ma sens z tego względu, że ludzie pisząc intra wykorzystują zasoby systemowe do różnych celów:)