Udało mi się ostatnio wrócić na trochę dłużej do projektu własnego "silnika gier".
Nie poddałem się jeszcze. Trochę różnych zmian wprowadzałem i podokrążyłem kilka rzeczy, żeby były w stanie działać. Na filmiku pokazuję proste animacje tłoku. Na razie na tylko tyle mnie stać, jeśli chodzi o tworzenie w blenderze.
Będzie troszkę technicznego pitolenia.
Najtrudniejsze, nad czym ostatnio główkowałem, to VAT (vertex animation texture). W skrócie, animacje obiektów nie ogarnia jak to zazwyczaj bywa CPU tylko GPU. U mnie animacje zapisuję jako plik png, dzięki czemu bez problemu mogę taką grafikę wykorzystać w shaderze. Pomysł na samo wykorzystanie pliku graficznego do zapisywania tego typu danych jest imo bardzo ciekawy. Każdy piksel, np. w formacie PNG, ma kilka warstw (RGBA) i w każdej z tych warstw można zapisać jakieś dane, np. nową pozycję danego wierzchołka.
Kolejne wyzwanie, które sobie wymyśliłem, to przejście z programowania w samym OpenGL (Silk.Net.OpenGL) na coś bardziej nowszego i uniwersalnego.
Trafiłem na Zenith.NET, bibliotekę-warstwę, gdzie, pisząc jedno, będzie to bez problemów działać na różnych API graficznych (Vulkan 1.4, DX12 oraz Metal) pod spodem. Poziom kontroli nad tym, jak wszystko działa, można porównać do tego, jakby programowało się w samym Vulkan-ie. Dodatkowym plusem jest jeszcze obsługa języka shaderów Slang (HLSL). Miodzio.
W wyrenderowaniu pojedynczego obiektu z teksturami lub kolorami nie mam już najmniejszego problemu.
Pod górkę zaczyna się, gdy chce się więcej obiektów na raz wyrenderować. Wtedy nie ma wyjścia i jedynym wyjściem jest zabawa z optymalizacją. Cach-owanie czego się da, batch rendering i inne pomniejsze.
Batch rendering można porównać do wysyłania wiadomości do wielu ludzi. Zamiast wysyłać do każdego człeka po kolei wiadomość, rozsyłamy na raz grupowo do wszystkich. Także zamiast wysyłać pojedynczą instrukcję dla każdego obiektu, wysyłamy jedną, żeby na raz wygenerowało ich kilka.
Zacząłem dodatkowo implementować pierwszą wersję systemu ECS. Odpowiada za zarządzanie obiektami, ich właściwościami i takie tam.
Co do GUI, to nadal pozostaje Dear ImGui. Aż takim masochistą nie jestem, żeby coś swojego robić.
Obiekty do renderowania wczytuję z plików .obj. Jest jednym z najprostszych formatów plików 3d, w których bez czytania dokumentacji ogarniesz zapisane dane. W parze ładuję też plik .mtl, który zawiera informację o kolorach i teksturach i jest tak samo prosty jak .obj.
Jak będą siły i czas, to będę sobie nadal w tym grzebał. Motywacja nadal jest, zwłaszcza że udało mi się parę blokerów pokonać i coś już faktycznie zaczyna działać, a to mnie jeszcze bardziej motywuje.
Robię to głównie dla siebie. Lubię poznawać, jak coś pod spodem działa. Tym razem padło na grafikę komputerową.
Im dłużej samemu w tym siedzę, tym bardziej podziwiam tych, co spędzają w tym większość swojego czasu.
Web-ówka się do tego nie umywa.
#gamedev #programowanie #csharp #chwalesie #grafikakomputerowa
