Test świecił na zielono przy każdej z sześciu porażek

Najdroższa rzecz, jaką zrobiłem w tym projekcie, działała poprawnie za każdym razem. Test przechodził, zrzuty wyglądały dobrze, liczby się zgadzały. A efekt był zły i nie umiałem powiedzieć dlaczego. Sześcioma podejściami zapłaciłem za jeden błąd, którego nie widać w żadnym logu.

Co miało być

Gra dzieje się w cyklu dnia i nocy. W dzień budujesz osadę, w nocy przychodzą po ciebie. Żeby noc była straszna, a nie po prostu ciemniejsza, potrzebowałem mgły. Takiej, która zakrywa horyzont, zbiera się w dolinach i sprawia, że widzisz dokładnie tyle, ile sobie oświetlisz.

Rozwiązanie techniczne było oczywiste: mgła objętościowa liczona w programie karty graficznej, metodą krokowego marszu promienia przez przestrzeń. Napisałem to. Zadziałało. I tu się zaczyna właściwa historia.

Nieudana wersja mgly objetosciowej, brazowa plama na srodku ekranu
Podejście czwarte. Technicznie: działa bez zarzutu. Wizualnie: brązowa plama na środku ekranu i wioska widoczna jak w południe.

Test, który sam siebie potwierdzał

Żeby nie oceniać mgły na oko, zrobiłem sondę. Program liczy na procesorze dokładnie ten sam marsz promienia, który wykonuje karta graficzna, i porównuje przezroczystość w ustalonych punktach sceny. To dobre narzędzie i korzystam z niego do dziś.

Problem polegał na czymś innym. Sonda mierzyła widoczność struktury kłębów mgły, a ja przez trzy podejścia poprawiałem właśnie widoczność struktury kłębów. Świeciła na zielono za każdym razem, bo mierzyła dokładnie to, co optymalizowałem.

Optymalizowanie złej metryki potrafi samo siebie potwierdzać. Im lepszy masz pomiar, tym pewniej idziesz w złą stronę.

A chodziło o coś zupełnie innego. Nie o strukturę mgły. O to, żeby było czuć noc. Tego zdania nie da się zmierzyć, więc nigdy nie zostało zapisane jako kryterium. I dlatego przez sześć podejść zgadywałem, gdzie ono leży.

To była moja wina i to konkretna. Nie usiadłem na początku i nie powiedziałem, na którym obrazku mgła jest już dobra. Uznałem, że będę wiedział, jak zobaczę. Nie wiedziałem.

PodejścieJak zawiodło
1za słaba
2jedzie z kamerą
3płaska z bliska
4brązowa plama
5znika przy zbliżeniu
6odrzucona
Każde podejście przeszło sondę. Żadne nie przeszło u człowieka patrzącego na ekran.

Techniczne dno tej historii

Tu robi się bardziej szczegółowo, ale to jest część, którą warto znać, jeśli sam robisz coś podobnego. Jeśli nie, przeskocz do następnego nagłówka, nic nie stracisz.

Trzy przyczyny udające jedną

Objaw brzmiał: „mgła jest płaska przy zbliżeniu”. Miał trzy niezależne przyczyny jednocześnie. Każda z osobna wyglądała jak zbyt słaby szum. Poprawienie jednej nie dawało żadnej widocznej zmiany, więc za każdym razem wyciągałem wniosek, że cały kierunek jest zły, i zaczynałem od zera.

To pułapka, która działa nie tylko w grafice. Kiedy poprawka nie daje efektu, pierwsza myśl brzmi „źle zdiagnozowałem”. Często prawidłowa jest „zdiagnozowałem jedną z trzech”.

Błąd, którego żaden zrzut nie mógł pokazać

Mgła dostała strefę czystą wokół kamery, żeby gracz widział własną osadę. Strefa liczona była od kamery, więc jechała razem z nią. Przy przybliżeniu obejmowała cały kadr i mgła po prostu znikała.

Zrobiłem kilkadziesiąt zrzutów weryfikacyjnych. Żaden tego nie pokazał, bo zrzut to stopklatka, a to był problem ruchu. Widać go dopiero, kiedy siedzisz przy grze i kręcisz kamerą.

Stopklatka nie ocenia ruchu. Zrzut nie pokaże paralaksy, dryfu z kamerą ani migotania. Trzy najczęstsze sposoby, w jakie efekt potrafi być zły.

Czym to się skończyło

Mgła objętościowa została odrzucona. Działa, jest w kodzie i nie jest używana. Zastąpiłem ją prostszą mgłą wysokościową plus mechaniką światła. Bo okazało się, że ciemność jest groźna nie dlatego, że jest gęsta, tylko dlatego, że coś w niej jest.

Pierwsza noc w grze, zjawy cofaja sie przed swiatlem ogniska
Pierwsza noc po zmianie podejścia. Zjawy cofają się przed światłem ogniska. Mgła przestała być efektem graficznym, a stała się zasadą gry.
Terytorium swiatla wokol osady w nocy
Terytorium światła. To, co oświetlone, jest bezpieczne. Cała mechanika mieści się w jednym zdaniu i działa lepiej niż sześć podejść do efektu.

I to jest chyba najważniejsza rzecz, którą wyniosłem z tamtego tygodnia. Przez sześć podejść próbowałem rozwiązać problem graficzny. Rozwiązanie okazało się projektowe: zamiast robić ciemność ładniejszą, dałem jej znaczenie w rozgrywce.

Co zostało warte zachowania

Sześć podejść nie poszło całkiem na marne. Zostały dwie rzeczy.

Po pierwsze, sam pomysł sondy liczbowej. Zła metryka to nie jest argument przeciwko mierzeniu. To argument przeciwko mierzeniu bez ustalenia, co ma być mierzone.

Po drugie, i to okazało się cenniejsze, zapisanie powodu odrzucenia. Odrzucony pomysł leży w projekcie razem z opisem, co konkretnie zawiodło i czego nie próbować ponownie. Bez tego za dwa miesiące zrobiłbym mgłę objętościową siódmy raz, bo przecież brzmi świetnie.

LiczbaCo znaczy
6podejść do mgły objętościowej
40+zrzutów weryfikacyjnych
0z nich pokazało prawdziwy błąd
Bilans tygodnia.

Co bym powiedział sobie sprzed tygodnia. Ustal kryterium na konkretnym obrazku referencyjnym, zanim napiszesz pierwszą linijkę. Test, który mierzy nie to, o co chodzi, jest gorszy niż brak testu, bo daje fałszywą pewność.


W następnym wpisie: gra była skończona, działała od początku do końca, i usłyszałem zdanie, które skasowało połowę moich planów. Powiedziałem je sobie sam.