Minecraft to gra, która w dużej mierze opiera się na mapie wysokości i wykorzystuje tę mapę heigtmap do zalania świata światłem. Z mojego zrozumienia, najwyższym punktem na mapie wysokości jest koniec obszaru wpływającego na światło słoneczne. Wszystko powyżej, co jest oświetlone światłem słonecznym, wszystko poniżej, na co wpływa tylko światło w pobliżu w promieniu 8 bloków.
Jeśli więc masz pływającą wyspę na szczycie swojego świata, wszystko pod nią będzie widziane zasadniczo jako jaskinia. Kiedy dwa światła wpływają na ten sam punkt, światło jaśniejsze wygrywa (nie jest to pewne).
Tak czy inaczej, istnieje kilka problemów z modelem oświetlenia Minecrafta: po pierwsze, jeśli twój świat nie ma mapy wysokości, trudniej jest ustalić, co dokładnie ma emitować światło słoneczne, a co nie. Prostym sposobem byłoby założenie, że świat jest (w moim przypadku) pływającą skałą, a następnie przemierzanie każdej osi z obu kierunków i ustalenie, gdzie skała się zaczyna i kończy. Ale to nie eliminuje całkowicie problemu, ponieważ wgniecenia w skale nie powinny znajdować się w ciemności.
Sam Minecraft będzie buforował informacje świetlne w swoich częściach wraz z informacjami o materiale bloku. Zatem tylko w przypadku modyfikacji świata oświetlenie musi zostać zaktualizowane. Niestety proces ten jest wciąż dość powolny w przypadku aktualizacji, a przy szybkich zmianach oświetlenia widać opóźnienie oświetlenia. Jest to szczególnie ważne, jeśli zmienia się wiele bloków (TNT, zachód itp.) I nie używasz najszybszego komputera (lub Java na Macu).
Z mojego wciąż ograniczonego rozumienia oświetlenia grafiki 3D świat taki jak Minecraft nie powinien być największym problemem. Jak poradziłbyś sobie z tym problemem?
Myślę, że podstawowe wymagania dotyczące oświetlenia w świecie wokseli byłyby
- aktualizuj wystarczająco szybko, aby mogło się to zdarzyć w jednej ramce. Można zrobić oświetlenie w urządzeniu graficznym i pobrać zmienione informacje o świetle do głównej pamięci RAM.
- informacje o świetle muszą być szybko dostępne dla głównej logiki gry, więc nie w całości oparte na urządzeniu graficznym: rozumowanie: światło wpływa na wzrost trawy, spawnowanie potworów itp.
- lekkie aktualizacje musiałyby być lokalne dla fragmentu lub mieć inne ograniczenia, aby nie trzeba było ponownie rozpalać całego świata, który może być bardzo duży.
Główną ideą byłoby szybkie aktualizowanie światła, niekoniecznie piękniejsze. W celu ogólnej poprawy wydajności renderowania światła można z łatwością dodać SSAO oprócz tego, co powinno dać o wiele ładniejszy świat.