# Optymalizacja oświetlenia w Unity: lightmapping, Light Probes i niestandardowe shadery
Rozwój projektów indie z otwartymi lokacjami nieuchronnie napotyka ograniczenia renderingu. Podczas gdy branża aktywnie przechodzi na HDRP i sprzętowy ray tracing, wbudowany pipeline Unity (Built-in RP) pozostaje praktycznym narzędziem dla zespołów, dla których liczy się przewidywalna wydajność i pełna kontrola nad pipeline'em. Klucz do stabilnego framerate'u bez wizualnych kompromisów tkwi w properym podziale oświetlenia statycznego i dynamicznego oraz w precyzyjnej optymalizacji wywołań rysowania.
Hybrydowe podejście: lightmapy kontra Light Probes
Efektywne oświetlenie sceny opiera się na wyraźnym podziale geometrii według priorytetów. Duża architektura, krajobraz i statyczne propsy są renderowane za pomocą pieczonych map oświetlenia. Do tego procesu najlepiej sprawdzają się zewnętrzne lightmappery, takie jak Bakery, które umożliwiają szybki prekalculację Global Illumination i poprawną obsługę refleksów bez nadmiernego obciążenia edytora.
Małe obiekty o złożonej topologii nie nadają się do pieczenia: prowadzi to do fragmentacji atlasów i wzrostu zużycia pamięci VRAM. Zamiast tego stosuje się system Light Probes. Sondy interpolują oświetlenie otoczenia, przekazując kolorowe refleksy i podstawowe zacienienie na dynamiczne lub małe statyczne meshe. Aby zoptymalizować batching identycznych propsów w tej samej strefie, można wymusić przypisanie im współrzędnych tej samej sondy. To zmniejsza liczbę unikalnych stanów renderu i obniża obciążenie CPU podczas przygotowywania klatek.
Ważnym elementem hybrydowego renderingu jest wykluczanie odległej geometrii z obliczeń oświetlenia w czasie rzeczywistym. Kierunkowe światło (Directional Light) i kaskadowe cienie szybko stają się wąskim gardłem, jeśli silnik próbuje je obliczać dla obiektów na horyzoncie. Wyłączenie wpływu realtime dla dalszego planu z pełnym przeniesieniem tych stref na lightmapy lub sondy radykalnie zmniejsza liczbę Draw Calls.
Ręczne zarządzanie Texel Density i odcinanie źródeł światła
Automatyczna generacja drugiej rozwinięcia UV pod lightmapy często daje wynik poniżej oczekiwań. Ręczna layout UV2 pozwala precyzyjnie rozłożyć Texel Density w zależności od kamery gry i znaczenia gameplayowego. Fasady budynków, korytarze i strefy aktywnej interakcji otrzymują wysoką gęstość tekseli, podczas gdy dachy, tylne strony ścian i niedostępne obszary są skompresowane do minimum. Taki sposób oszczędza miejsce w atlasach świetlnych i zapobiega artefaktom kompresji na pierwszym planie.
Dla równowagi między jakością a wydajnością w Unity stosuje się tryb Distance Shadowmask. W odległości 50–80 metrów od kamery silnik renderuje dynamiczne cienie i nakłada pieczony GI. Poza tym promieniem rysowane są wyłącznie statyczne cienie z lightmap. Przejście jest płynne, a obciążenie GPU stabilne.
Jednak wbudowany pipeline nie ma natywnego mechanizmu zdalnego odcinania punktowych i reflektorowych źródeł światła. Lampy w odległych pokojach nadal są obliczane, marnując zasoby. Rozwiązanie implementuje się poprzez niestandardowy menedżer: skrypt przechowuje pulę aktywnych źródeł, co 2–3 sekundy sprawdza odległość do kamery i przełącza stan enabled. Asynchroniczne sprawdzanie zapobiega mikrozawieszeniom i gwarantuje, że w kadrze pracują tylko wizualnie istotne źródła.
Projekcja oświetlenia terenu za pomocą niestandardowego shadera
Dekoracje terenowe (zaspane, kamienie, roślinność) stwarzają poważny problem dla standardowego lightmappingu. Pieczenie każdego małego obiektu trwa długo, a użycie Light Probes dla tysięcy instancji generuje zbędne wywołania rysowania i psuje statyczny batching.
Skutecznym obejściem jest napisanie shadera, który projektuje lightmapę terenu na nakładaną geometrię od góry w dół. Mapa oświetlenia musi zawierać wyłącznie dane terenu. Shader odczytuje światowe współrzędne wierzchołków dekoracji, transformuje je do przestrzeni UV terenu i sampluje odpowiadający teksel pieczonego światła. Wynik imituje ambient occlusion i podstawowe oświetlenie bez zależności od sond.
Dodatkowo w shaderze integruje się vertex blending. Przy kontakcie dolnej części mesha z powierzchnią terenu następuje płynne mieszanie albedo, normalnych i masek chropowatości. To eliminuje sztywne złącza, tworzy efekt przyklejania śniegu u podstawy obiektów i wizualnie łączy rozproszone propsy z terenem w jednolitą geometrię. Metoda całkowicie usuwa szwy na przecięciach i działa znacznie szybciej niż postprocessing czy złożone systemy wokselowego mieszania.
Modyfikacja kaskadowych cieni i programowe rozmycie
Standardowe cienie Directional Light w Unity cierpią na dwie skrajności: albo są zbyt ostre i schodkowe, albo rozmyte z zauważalnym migotaniem przy obniżeniu rozdzielczości Shadow Map. W rzeczywistych warunkach miękkość cienia zależy od odległości do okludera i kątowego rozmiaru źródła światła. Cień u podstawy obiektu jest zawsze ostry, ale im dalej, tym penumbra się rozszerza.
Aby symulować fizycznie poprawnie zachowanie bez przechodzenia na ciężkie pipeliny, stosuje się algorytm kontaktowego cieniowania z progresywnym rozmazywaniem kaskad. Zewnętrzne rozwiązania modyfikują standardowy pipeline cieni, dodając filtrację opartą na głębokości i odległości od kamery. Pozwala to zachować wysoką rozdzielczość Shadow Map dla bliskiej strefy i płynnie rozmazywać dalsze kaskady, eliminując aliasing i obniżając wymagania fillrate'u. W przeciwieństwie do wbudowanych odpowiedników w HDRP, taki sposób nie wymaga obliczeń ray tracingowych ani ciężkich postefektów, zachowując kompatybilność ze średnim sprzętem.
Co ważne
• Hybrydowy rendering wymaga wyraźnego podziału geometrii: lightmapy dla dużej statyki, Light Probes dla małego dekoru i obiektów dynamicznych.
• Ręczna konfiguracja UV2 i Texel Density oszczędza pamięć VRAM i zwiększa szczegółowość oświetlenia w kluczowych strefach gameplayowych.
• Niestandardowe shadery projekcji lightmap terenu eliminują potrzebę sond dla tysięcy małych obiektów, zmniejszając Draw Calls i poprawiając batching.
• Zdalne odcinanie punktowych źródeł światła poprzez menedżer puli kompensuje brak natywnej funkcjonalności w Built-in RP.
• Progresywne rozmazywanie kaskadowych cieni według odległości rozwiązuje problem aliasingu i migotania bez spadku wydajności.
— Editorial Team
Brak komentarzy.