DEV Community

Konrad Chmielecki
Konrad Chmielecki

Posted on • Updated on

miotam się

ping pong
Gdy pisałem o tym że kod to nie wszystko, nie byłem świadom że posiadam projekt od którego coś chcę, ale nie wiem do końca co.

Chciałem mieć własną bibliotekę graficzną nastawioną na pixel art. Głównie w kontekście gier.

Pierwsza wersja była pisana przy użyciu C i SDL2. Miała przetwarzać grafikę programowo bez użycia akceleracji sprzętowej. Jednak z czasem musiałem dodać OpenGL. Ponieważ wysyłanie 60 klatek na sekundę do bufora SDL2 powodowało zbyt duże obciążenie dla procesora. Więc zamiast wysyłać obraz przez SDL2 wysyłałem bezpośrednio do tekstury w OpenGL.

Potem przepisywałem bibliotekę z C do JavaScript. Co okazało się dość proste za sprawą tablic o statycznych typach. Potem z powrotem do C, ale tym razem z wsparciem dla Emscripten. A teraz znowu do JavaScript. Tylko tym razem rezygnując z renderowania programowego na rzecz akceleracji sprzętowej i skupiając się na wydajności na urządzeniach mobilnych.
Długo się wzbraniałem przed używaniem w pełni OpenGL ze względu na GLSL. Bo pisząc podprogramy dla OpenGL czy WebGL mam wrażenie poruszania się po omacku. Ale da się to ogarnąć jeżeli zrozumie się jak GLSL działa. Choć brakuje mi sposobu aby wyświetlić wartości zmiennych.

Teraz gdy shadery które piszę nabierają kształtu, pojawiły się pytania na które mam problem z odpowiedzią.

Pytania czysto techniczne takie jak czy użyć instancje, a jeżeli tak to kiedy. Jak i również pytania egzystencjalne, po co i jak użyć biblioteki.

O ile pytanie odnoście instancji mogę odroczyć, bo to jest kwestia wydajności. Tak pytania tego jak użyć odroczyć nie mogę.
Bo to pytanie kształtuje dalszy rozwój biblioteki.

Wiem że chce użyć jej do grafiki pokroju gier z urządzeń 8 i 16 bitowych. I też trochę się wzoruje nad tym jak są umieszczane grafiki w pamięci.
Bo wszystkie grafiki są wysyłane do jednej dużej tekstury. Która jest reprezentacją pamięci GPU.
Kolory są zindeksowane. Co znaczy że piksele grafiki nie składają się z wartości RGB, a z wartości która reprezentowana jest przez index palety kolorów.
Dzięki temu grafika która ma na przykład wymiary 8 na 8 zajmuje 64 bajty. Gdzie w przypadku trzymania każdego piksela jako wartość RGB zajmowałaby 3 razy więcej pamięci.
Dzięki temu oszczędza się nie tylko pamięć ale również daje możliwość podmiany palety kolorów na inną.

I może to właśnie powoduje że się nie mogę zdecydować jak biblioteka ma wyglądać. Bo z jednej strony chce aby odzwierciedlała ere 8 i 16 bitów, nie tylko z wyglądu. A z drugiej strony chce aby była jak typowa biblioteka graficzna.

Tak to jest jak niema się jasnej wizji tego czego się chce. Bo albo niema się nic, albo coś z czego nie jest się zadowolonym.
Na szczęście tworzenie tej biblioteki nie wymaga ode mnie zbyt dużo wysiłku.

Discussion (0)