Dzisiaj zauważyliśmy z Cvenim dziwnego i bardzo nieprzyjemnego buga związanego z wyświetlaniem levelu w specyficznych sytuacjach. Wsadziliśmy najnowszą wersję levelu do gry, przy czym głównie zwiększyła się liczba poly kolizji – wzrosła z ok. 6k do 32k, ale to, jak myślałem, niewiele – z przeprowadzonych jakiś czas temu testów wynikało, że gra jest w stanie uciągnąć 200k do wyświetlania i 200k do kolizji przy fps ~5 na moim leciwym już raczej sprzęcie. Ale, do rzeczy – uruchomiliśmy z zamiarem zobaczenia, jak wygląda oświetlony level, a naszym oczom ukazało się… w tym problem, że prawie nic się nie ukazało. W zależności od kąta patrzenia kamery znikały różne, zapewne losowe węzły sceny (w całości) oraz poszczególne trójkąty. Miganie bardzo denerwujące i praktycznie uniemożliwiające grę. Kolizje chodziły bardzo ładnie, bez żadnych przekłamań, i właściwie jedyny problem stanowił właśnie ów bug z losowy znikaniem części levelu.
Wstawiliśmy na level wodę. Uruchomiliśmy, i… hurra, działa. Nic nie znika! Dopiero kolejne parę minut pozwoliło odkryć, że działa tylko w przypadku włączenia wody “tej lepszej”, w której widoczne są odbicia – w przypadku tej przeznaczonej na słabsze komputery (animowane tekstury) problem dalej był tak samo widoczny. Po następnych kilku minutach udało się zauważyć, że w przypadku “lepszej” wody problem dalej występuje. Tyle, że w odbiciu, a nie na całym ekranie.
Woda jest renderowana w następujący sposób:
- ustawienie render targeta na “refraction map” (heh, jak to będzie po polsku? “mapa refrakcji”?)
- wyrenderowanie sceny
- ustawienie render targeta na “reflection map” (“mapa odbić”?)
- ustawienie kamery “od wody”
- wyrenderowanie sceny
- ustawienie starej kamery i standardowego render targeta
Woda jest renderowana jako pierwszy węzeł sceny, i to w odbiciu w wodzie widać “znikanie” losowych węzłów sceny. Wszystkie elementy sceny są rysowane 2 razy dla wody i raz na ekran. Przy ustawianiu rendertargeta czyszczone są backbuffer i zbuffer. To naprawdę nie jest śmieszne, naprawdę. Bo niby jak mam naprawić tego buga, skoro nawet nie wiem, o co w nim chodzi?
Aktualizacja:
Przetestowałem teraz ten level u siebie – jeszcze jedna ciekawostka. Teraz niezależnie do tego, czy woda jest, czy jej nie ma, miga zawsze. Fajnie. Przynajmniej jakaś konsekwencja jest.
Aktualizacja 2:
Zmieniłem kolor, którym czyszczony jest backbuffer podczas ustawiania rendertargeta. Było (255, 255, 255, 255) [RGBA], zmieniłem na (0, 0, 0, 255). Testowałem dwukrotnie, i w obu testach nic nie migocze. To jest podejrzane, bo to jest wartość, która była także przy wykryciu buga. Czyżby bug się ukrywał? Pff…
Aktualizacja 3:
Test 3, warunki identyczne jak przy poprzednich testach – jednak miga ;/ Z bardzo dużą częstotliwością, gdy wody nie widać (frustum culling), z dużo mniejszą, gdy wodę widać, ale dalej miga. Będzie parę dni zabawy…