320 likes | 530 Views
Light pre-pass renderer. Marcin Korniluk. Plan prezentacji. Podejście klasyczne i Z pre-pass Carmacka Deferred shading Light pre-pass renderer Demo Podsumowanie. To każdy zna. Podejście Klasyczne. Podejście klasyczne. Opcja 1: Jeden przebieg Warianty shaderów dla różnych świateł
E N D
Lightpre-passrenderer Marcin Korniluk
Plan prezentacji • Podejście klasyczne i Z pre-passCarmacka • Deferredshading • Lightpre-passrenderer • Demo • Podsumowanie Marcin Korniluk - Light Pre-Pass Renderer
To każdy zna Podejście Klasyczne Marcin Korniluk - LightPre-PassRenderer
Podejście klasyczne • Opcja 1: Jeden przebieg • 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-PassCarmacka • 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
Przypomnienie DeferredShading Marcin Korniluk - LightPre-PassRenderer
Deferredshading • 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
Deferredshading – cd. • Obiekty lite • Obiekty przezroczyste Kolor Normalne Głębokość Intensywność Oświetlenie i rysowanie Rysowanie 2 Marcin Korniluk - Light Pre-Pass Renderer
Deferredshading – etap geometrii • Dane sceny zapisywane do kilku buforów Marcin Korniluk - Light Pre-Pass Renderer
Deferredshading – 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
Deferredshading – wady • Anti-aliasing • Brak sprzętowego wsparcia MSAA • Alphablending • Nie można zapisywać głębokości obiektów przezroczystych • Fillratebound • Ograniczenia materiałów • Materiały muszą być prawie jednakowe Marcin Korniluk - Light Pre-Pass Renderer
Nowe podejście LightPre-PassRenderer Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-passrenderer • Wolfgang Engel – czerwiec 2007 • Lekkie podejście do deferredshadingu • 3 etapy renderowania • Przygotowanie • Oświetlenie • Rysowanie Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-passrenderer – cd. • Obiekty lite • Obiekty przezroczyste Normalne Głębokość Oświetlenie Rysowanie Rysowanie 2 Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – przygotowanie • Do bufora zapisujemy normalne i głębokość • Potrzebne do oświetlenia • Wystarczy jeden RT RGBA8 • Sortowanie „od najbliższego” 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 float3eyeVec = float3(x * aspect, y, 1/tan(fov/2)); float4pixelPosView = float4(normalize(eyeVec) * depth; Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – przygotowanie, cd. Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – oświetlenie • Do bufora zapisywane oświetlenie • Światła renderowane jako bryły • Wystarczy jeden RT RGBA8 • HDR • Techniki optymalizacji jak w deferredshading • Takie same zalety • I wady Marcin Korniluk - LightPre-PassRenderer
Pakowanie danych – kolor • RGB źle się pakuje • Można pominąć kolor zwierciadlany • Może YUV? Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – oświetlenie, cd. Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – rysowanie • Rysowanie „od najbliższego” • Minimalna nadmiarowość • Dowolność materiałów • Obiekty przezroczyste rysowane klasycznie • Podobnie jak w deferredshading Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – rysowanie, cd. • Przykładowy pixelshader float3normal = normalize(psIn.normal); float3light = normalize(psIn.light); float3view = normalize(psIn.view); float3diffuseLight =getDiffuseLight(normal,light); float3specularLight = getSpecularLight(normal,light,view); Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – rysowanie, cd. • Przykładowy pixelshader float3diffuseLight = LightBuffer.Sample(sampler,psIn.position).xyz; floatspecularLight = 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 • Deferredshading • Lightpre-pass Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – wady • Efekty z VS • Displacementmapping • Redundantna transformacja sceny • Koszt porównywalny z generacją SM • Idealna nadmiarowość odrysowywania Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-pass – wady, cd. • Alpha-blending • Przezroczyste obiekty rysowane klasycznie • Depth-peeling, A-Buffer, SRK-Buffer, PP Linked List … • Wysoki fillrate • Niższy niż dla DS. • Ulepszenia takie jak dla DS. • Rysowanie brył otaczających • Algorytm Lengyela Marcin Korniluk - Light Pre-Pass Renderer
Lightpre-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
2 slajdy do końca Podsumowanie 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