Michał Drobot Technical Art Director Reality Pump Multi Light Shading Michał Drobot Technical Art Director Reality Pump
Plan wykładu Problem wielu świateł Architektury oświetlenia Forward Rendering Single-pass, multi-light Multi-pass, multi-light Deferred rendering Deferred Shading
Problem wielu świateł Współczesne gry wymagają Zaawansowanego oświetlenia dynamicznego Wielu świateł na klatkę >10 scenariusze polowe >50 scenariusze miejskie Metod aproksymacji GI (global Illumination) Być może przy pomocy wielu świateł
Problem wielu świateł Światła istnieją jako obiekty w świecie gry Dwie podstawowe metody Przekazać światła do shaderów obiektów, aby zostały uwzględnione w modelu oświetlenia Wyrenderować światła do buforów pośrednich rozbijając równanie oświetlenia
Problem wielu świateł Light = Ambient + Sum(N.L * Att * LightD + N.L * (N.H)^n * MatSpecD * N.L *Att) Należy wyliczyć sumę oświetlenia dla dalszych obliczeń materiału BRDF(Light) BRDF(DiffuseLight,Specular)
Single Pass, Multi-light Dla każdego obiektu Znajdź światła mające wpływ na obiekt Partycjonowanie przestrzeni Kosztowne sortowania i sprawdzania dystansu Wyrenderuj wszystkie światła i materiał w pojedynczym shaderze Eksplozja shaderów Potrzebna ilość shaderów = kombinacje(materiał , ilość świateł) Ciężka integracja z cieniami Shadow mapy muszą być ciągle w pamięci Zmarnowane cykle GPU Trójkąty poza zasięgiem światła Niewidoczne obiekty / overdraw
Multi Pass, Multi-light Dla każdego światła Dla każdego obiektu Dodaj oświetlenie od światła do framebuffera FrameBuffer += brdf(object, light) Eksplozja shaderów Potrzebna ilość shaderów = kombinacje(materiał , ilość świateł) Zmarnowane cykle GPU Trójkąty poza zasięgiem światła Niewidoczne obiekty / overdraw Dużo powtarzanej pracy z każdym passem Transformacje vertexów Filtrowanie Wysoki Batch Count (1/obiekt/światło)
Deferred Rendering Dla każdego światła i każdego oświetlanego pixela Dla każdego obiektu Wyrenderuj parametry powierzchni do G-Buffera Dla każdego światła i każdego oświetlanego pixela Użyj G-Buffera do obliczeń światła Dodaj wynik do framebuffera Proste shadery Dobrze skalowalne ze wzrostem ilości pixeli jak i światel Problematyczna obsługa przeźroczystości Łatwa integracja cieni Złożoność głębi dla świateł O(1) Wiele małych świateł = jedno duże
Deferred Rendering Do wyliczenia równania światła potrzebujemy Light = Ambient + Sum(N.L * Att * LightD + N.L * (N.H)^n * MatSpecD * N.L *Att) BRDF(Light) OR BRDF(Diffuse,Specular) Do wyliczenia równania światła potrzebujemy Normal Pozycja Atrybuty Specular Intensity, Specular Glossines (n)
Deferred Rendering BRDF(Diffuse, Specular) Do obliczenia pełnego BRDF potrzeba dodatkowo Material Diffuse Material Attributes Typ materiału Parametry materiału niezależne od światła
Deferred Shading Obiekty nieprzeźroczyste Przeźroczyste obiekty Normals Specular / Motion Vec Albedo / Shadow Depth Buffer Light Buffer Wyłączone pisanie Depth Forward Rendering Deferred Lighting Sortowanie Back – To - Front
Deferred Shading Podczas wyliczeń światła tworzymy light buffer Zapisujemy pełen G-Buffer dla pełnego wyliczenia BRDF Podczas jednego przebiegu geometrii Każde światło renderujemy z osobna jako Quad o wymiarach policzonych w screen space Kule – point light Stożek – spot light Podczas wyliczeń światła tworzymy light buffer Ostatecznie wyliczamy pełen BRDF podczas Deferred Lighting Pass Integruje materiały z wynikami light buffera
Deferred Shading Rozbijamy warstwę obliczeń geometrii i światła na dwa osobne przebiegi Przebieg geometrii generuje parametry w pełni opisujące materiał jak i jego interakcje ze światłem Przykładowy G-Buffer (Killzone 2)
Deferred Shading MRT Podczas przebiegu geometrii piszemy do wszystkich buforów Bufory muszą mieć ten sam alignment Np. możliwe kombinacje (również uzależnione od platformy) RGBA16 RG32 W TW2 RGBA8 – Diffuse, Specular Intensity RGBA8 – XY Normal, Specular Glossines, Material ID RGBA8 – Linear Depth zapisana na 32bitach (nieobecny na konsolach ze względu na bezpośredni dostęp do Zbufora)
Deferred Rendering Operacje wektorowe wyliczenia światła Potrzebujemy Pozycji pixela w WorldSpace lub ViewSpace Pozycji Światła w WS lub VS Dla uproszczenia przyjmijmy wykonywanie obliczeń w View Space (Camer Space)
Deferred Rendering Pozycja Pozycje pixela w CS możemy zapisać do MRT Wymaga dużej precyzji i 3 kanałów RGBA16F Marnowanie pamięci i przepustowości Pozycja może być odtworzona z położenia pixela na ekranie oraz jego głębi liniowej w CS Macierz odwrotna do macierzy projekcji
Deferred Rendering Normalne Ze względu na precyzję oraz znak zapisujemy w CS Znak zawsze dodatni Umożliwia kompresje bufora Normal.z = sqrt(1.0 – Normal.x^2 – Normal.y^2)
Deferred Rendering Atrybuty powierzchni Przechowywane w sposób upakowany Czasem wymagana kompresja zakresu Np. Specular Power do skali log itp
Deferred Rendering Głębia Zapisywana w formacie liniowym (Position.z w CS) zamiast log Z-bufora W przypadku formatów INT możliwy zapis poprzez kompresje Float->RGB8 Kompresja ręczna, zależna od dokładności Na konsolach możliwy odczyt bezpośredni Z-bufora wraz z dekompresją do liniowego
Deferred Rendering Light Buffer Preferowany format HDR RGBA16F RGB – Light Diffuse A – Specular Intensity Dla każdego światła (Light Accumulation) W trybie ADD Blend Renderujemy w CS Convex Hull reprezentujący wymiary światła w CS Quad Sphere Cone Dodatkowe przebiegi dla świateł kierunkowych (słońce) oraz Ambient Light
Deferred Rendering Deffered Lighting Przebieg czyta Light Buffer Bufory atrybutów materiałów (minimalnie Diffuse Color) Wykonuje obliczenia BRDF Wspólny BRDF dla wszystkich pixeli Uwzględnione możliwe parametry materiału Sterowany parametrami (parametr = kanał G-Buffera) Mała customizacja oraz brak skalowalności na ilość parametrów i różne materiały Wiele przebiegów kilku BRDF-ów Wolne ze względu na ilość przebiegów Korzystanie z material ID Seria IF-ów decydująca o wykonaniu BRDF Kosztowna dla ALU Korzystanie z zapisanych BRDF-ów wraz z indexem materiału Textura 3D – (U,V,W) = (N.L , H.L, MaterialID) Wolne w odczycie Tex3D, odczyty zależne, mało funkcjonalne w trakcie produkcji
Deferred Rendering Końcowy bufor Zawiera prawidłowo oświetloną scenę w formacie HDR Na nim przeprowadzamy operacje wblendowywania obiektów nieprzeźroczystych, o materiałach nie uwzględmionych w trybie deferred Dla każdego obiektu specjalnego HDR Framebuffer = (Alpha Blend)[BRDF(obiekt, światła)] - w trybie forward Na nim przeprowadzamy operacje wblendowywania obiektów przeźroczystych Dla każdego przeźroczystego obiektu W trybie Blend (Add, Mul, MulAdd etc.) HDR Framebuffer += BRDF(obiekt, światła) - w trybie forward Podobnie wblendowujemy particle Jest wejściem dla całego etapu post processingu Potem ulega HDR Resolve i uzyskujemy końcowy framebuffer LDR
Deferred Shading Optymalizacje Chcemy oświetlać jedynie geometrie w środku light volume’a Pozostałe pixele są zmarnowaną pracą W środku volume’a Poza volume’em, Będzie cieniowane, Wynik będzie odrzucony Poza volume’em, Nie będzie cieniowane
Optymalizacje Optymalizacje mające na celu ograniczenie cieniowanych obszarów przy użyciu bufora Z Stencil Cull Depth Bound Test
Optymalizacje Optymalizacje mające na celu ograniczenie cieniowanych obszarów przy użyciu bufora Z Stencil Cull Depth Bound Test
Optymalizacje Zaznaczenie pixele przed tylną granicą światła Wyrenderuj back-faces światła Depth test : GREATER-EQUAL Zapisz wynik do STENCIL
Optymalizacje Zaznaczenie pixeli wewnątrz światła Zacznij własciwy shader światła Wyrenderuj front-faces światła Depth test : LESS-EQUAL Wykonaj stencil test EQUAL
Podsumowanie For more information contact me hello@drobot.org Slides will be available at Drobot.org
Questions ?