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.

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ście | Jak zawiodło |
|---|---|
| 1 | za słaba |
| 2 | jedzie z kamerą |
| 3 | płaska z bliska |
| 4 | brązowa plama |
| 5 | znika przy zbliżeniu |
| 6 | odrzucona |
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.


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.
| Liczba | Co znaczy |
|---|---|
| 6 | podejść do mgły objętościowej |
| 40+ | zrzutów weryfikacyjnych |
| 0 | z nich pokazało prawdziwy błąd |
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.