Light pre-pass renderer Marcin Korniluk
Plan prezentacji Podejście klasyczne i Z pre-pass Carmacka Deferred shading Light pre-pass renderer Demo Podsumowanie Marcin Korniluk - Light Pre-Pass Renderer
Podejście Klasyczne To każdy zna Marcin Korniluk - Light Pre-Pass Renderer
Podejście klasyczne Opcja 1: Jeden przebieg Opcja 2: Wiele przebiegów Warianty shaderów dla różnych świateł Słaby batching Opcja 2: Wiele przebiegów Mało shaderów Dużo niepotrzebnej pracy Minimalizacja ilości przetwarzanych świateł Marnotrawstwo cykli Marcin Korniluk - Light Pre-Pass Renderer
Z Pre-Pass Carmacka Pierwszy przebieg rysuje tylko głębię Sortowanie „od najbliższych” Prosty shader Drugi przebieg rysuje resztę Kompletne shadery Minimalna nadmiarowość rysowania Nadal wiele wad Wykorzystane przez producentów GPU Marcin Korniluk - Light Pre-Pass Renderer
Deferred Shading Przypomnienie Marcin Korniluk - Light Pre-Pass Renderer
Deferred shading Pomysł padł na SIGGRAPH 88 Złożoność oświetlenia O(n+m) zamiast O(nm) Rozbicie renderowania na 2 etapy Geometrii Oświetlenia Marcin Korniluk - Light Pre-Pass Renderer
Deferred shading – cd. Obiekty lite Obiekty przezroczyste Kolor Normalne Głębokość Intensywność Oświetlenie i rysowanie Rysowanie 2 Marcin Korniluk - Light Pre-Pass Renderer
Deferred shading – etap geometrii Dane sceny zapisywane do kilku buforów R8 G8 B8 A8 Depth Stencil Lighting Accumulation RGB Intensity Normal.x Normal.y Motion.x Motion.y Spec-power Spec-Intensity Diffuse Albedo RGB Sun-Occlusion Marcin Korniluk - Light Pre-Pass Renderer
Deferred shading – etap oświetlenia Światła jako bryły Parametry per pixel pobierane z G-Bufora Możliwa duża ilość świateł Marcin Korniluk - Light Pre-Pass Renderer
Deferred shading – wady Anti-aliasing Brak sprzętowego wsparcia MSAA Alpha blending Nie można zapisywać głębokości obiektów przezroczystych Fill rate bound Ograniczenia materiałów Materiały muszą być prawie jednakowe Marcin Korniluk - Light Pre-Pass Renderer
Light Pre-Pass Renderer Nowe podejście Light Pre-Pass Renderer Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass renderer Wolfgang Engel – czerwiec 2007 Lekkie podejście do deferred shadingu 3 etapy renderowania Przygotowanie Oświetlenie Rysowanie Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass renderer – cd. Obiekty lite Obiekty przezroczyste Normalne Głębokość Oświetlenie Rysowanie Rysowanie 2 Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – przygotowanie Do bufora zapisujemy normalne i głębokość Potrzebne do oświetlenia Wystarczy jeden RT RGBA8 Sortowanie „od najbliższego” R8 G8 B8 A8 Normal.x Normal.y Depth Marcin Korniluk - Light Pre-Pass Renderer
Pakowanie danych – normalna Trzecią współrzędną normalnej da się wyznaczyć Twierdzenie Pitagorasa Znak jest stały (w większości przypadków) Dla RT RGBA16F nie trzeba pakować Marcin Korniluk - Light Pre-Pass Renderer
Pakowanie danych – pozycja Wystarczy zapisać długość wektora float3 eyeVec = float3(x * aspect, y, 1/tan(fov/2)); float4 pixelPosView = float4(normalize(eyeVec) * depth; Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – przygotowanie, cd. Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – oświetlenie Do bufora zapisywane oświetlenie Światła renderowane jako bryły Wystarczy jeden RT RGBA8 HDR Techniki optymalizacji jak w deferred shading Takie same zalety I wady Marcin Korniluk - Light Pre-Pass Renderer
Pakowanie danych – kolor RGB źle się pakuje Można pominąć kolor zwierciadlany Może YUV? R8 G8 B8 A8 Diffuse.r Diffuse.g Diffuse.b Specular Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – oświetlenie, cd. Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – rysowanie Rysowanie „od najbliższego” Minimalna nadmiarowość Dowolność materiałów Obiekty przezroczyste rysowane klasycznie Podobnie jak w deferred shading Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – rysowanie, cd. Przykładowy pixel shader float3 normal = normalize(psIn.normal); float3 light = normalize(psIn.light); float3 view = normalize(psIn.view); float3 diffuseLight = getDiffuseLight(normal,light); float3 specularLight = getSpecularLight(normal,light,view); Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – rysowanie, cd. Przykładowy pixel shader float3 diffuseLight = LightBuffer.Sample(sampler,psIn.position).xyz; float specularLight = LightBuffer.Sample(sampler,psIn.position).w; Marcin Korniluk - Light Pre-Pass Renderer
Anti-aliasing Sprzętowy MSAA Nie jest tak różowo Marcin Korniluk - Light Pre-Pass Renderer
Rozmiar ramki obrazu Deferred shading Light pre-pass Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – wady Efekty z VS Redundantna transformacja sceny Displacement mapping Redundantna transformacja sceny Koszt porównywalny z generacją SM Idealna nadmiarowość odrysowywania Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – wady, cd. Alpha-blending Przezroczyste obiekty rysowane klasycznie Depth-peeling, A-Buffer, SRK-Buffer, PP Linked List … Wysoki fill rate Niższy niż dla DS. Ulepszenia takie jak dla DS. Rysowanie brył otaczających Algorytm Lengyela Marcin Korniluk - Light Pre-Pass Renderer
Light pre-pass – wady, cd. 2 Rekonstrukcja koloru Nagięcie reguł daje dobre rezultaty Marcin Korniluk - Light Pre-Pass Renderer
Demo Marcin Korniluk - Light Pre-Pass Renderer
Podsumowanie 2 slajdy do końca Marcin Korniluk - Light Pre-Pass Renderer
Podsumowanie Brak ograniczeń MRT Sprzętowy anti-aliasing Niski fill-rate Dwukrotne transformacje Ale bez oświetlenia Bardzo dobry batching Marcin Korniluk - Light Pre-Pass Renderer