Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałDita Herba Został zmieniony 10 lat temu
1
Architektury Deferred Michał Drobot Technical Art Director Reality Pump
2
Deferred ShadingDeferred Shading Light Pre-PassLight Pre-Pass Plan wykładu
3
Dla każdego obiektuDla każdego obiektu Wyrenderuj parametry powierzchni do G-BufferaWyrenderuj parametry powierzchni do G-Buffera Dla każdego światła i każdego oświetlanego pixelaDla każdego światła i każdego oświetlanego pixela Użyj G-Buffera do obliczeń światłaUżyj G-Buffera do obliczeń światła Dodaj wynik do framebufferaDodaj wynik do framebuffera Proste shaderyProste shadery Dobrze skalowalne ze wzrostem ilości pixeli jak i światelDobrze skalowalne ze wzrostem ilości pixeli jak i światel Problematyczna obsługa przeźroczystościProblematyczna obsługa przeźroczystości Łatwa integracja cieniŁatwa integracja cieni Złożoność głębi dla świateł O(1)Złożoność głębi dla świateł O(1) Wiele małych świateł = jedno dużeWiele małych świateł = jedno duże Deferred Rendering
4
Light = Ambient + Sum(N.L * Att * LightD + N.L * (N.H)^n * MatSpecD * N.L *Att)Light = Ambient + Sum(N.L * Att * LightD + N.L * (N.H)^n * MatSpecD * N.L *Att) BRDF(Light) OR BRDF(Diffuse,Specular)BRDF(Light) OR BRDF(Diffuse,Specular) Do wyliczenia równania światła potrzebujemyDo wyliczenia równania światła potrzebujemy NormalNormal PozycjaPozycja AtrybutyAtrybuty Specular Intensity, Specular Glossines (n)Specular Intensity, Specular Glossines (n) Deferred Rendering
5
BRDF(Diffuse, Specular)BRDF(Diffuse, Specular) Do obliczenia pełnego BRDF potrzeba dodatkowoDo obliczenia pełnego BRDF potrzeba dodatkowo Material DiffuseMaterial Diffuse Material AttributesMaterial Attributes Typ materiałuTyp materiału Parametry materiału niezależne od światłaParametry materiału niezależne od światła Deferred Rendering
6
Deferred Shading Depth Buffer Light Buffer Forward Rendering Wyłączone pisanie Depth Specular / Motion Vec Normals Albedo / Shadow Sortowanie Back – To - Front Obiekty nieprzeźroczystePrzeźroczyste obiekty Deferred Lighting
15
Zapisujemy pełen G-Buffer dla pełnego wyliczenia BRDFZapisujemy pełen G-Buffer dla pełnego wyliczenia BRDF Podczas jednego przebiegu geometriiPodczas jednego przebiegu geometrii Każde światło renderujemy z osobna jakoKażde światło renderujemy z osobna jako Quad o wymiarach policzonych w screen spaceQuad o wymiarach policzonych w screen space Kule – point lightKule – point light Stożek – spot lightStożek – spot light Podczas wyliczeń światła tworzymy light bufferPodczas wyliczeń światła tworzymy light buffer Ostatecznie wyliczamy pełen BRDF podczas Deferred Lighting PassOstatecznie wyliczamy pełen BRDF podczas Deferred Lighting Pass Integruje materiały z wynikami light bufferaIntegruje materiały z wynikami light buffera Deferred Shading
16
Rozbijamy warstwę obliczeń geometrii i światła na dwa osobne przebiegiRozbijamy 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łemPrzebieg geometrii generuje parametry w pełni opisujące materiał jak i jego interakcje ze światłem Przykładowy G-Buffer (Killzone 2)Przykładowy G-Buffer (Killzone 2) Deferred Shading
17
Light BufferLight Buffer Preferowany format HDRPreferowany format HDR RGBA16FRGBA16F RGB – Light Diffuse A – Specular IntensityRGB – Light Diffuse A – Specular Intensity Dla każdego światła (Light Accumulation)Dla każdego światła (Light Accumulation) W trybie ADD BlendW trybie ADD Blend Renderujemy w CS Convex Hull reprezentujący wymiary światła w CSRenderujemy w CS Convex Hull reprezentujący wymiary światła w CS QuadQuad SphereSphere ConeCone Dodatkowe przebiegi dla świateł kierunkowych (słońce) oraz Ambient LightDodatkowe przebiegi dla świateł kierunkowych (słońce) oraz Ambient Light Deferred Rendering
18
Deffered ShadingDeffered Shading Przebieg czytaPrzebieg czyta Light BufferLight Buffer Bufory atrybutów materiałów (minimalnie Diffuse Color)Bufory atrybutów materiałów (minimalnie Diffuse Color) Wykonuje obliczenia BRDFWykonuje obliczenia BRDF Wspólny BRDF dla wszystkich pixeliWspólny BRDF dla wszystkich pixeli Uwzględnione możliwe parametry materiałuUwzględnione możliwe parametry materiału Sterowany parametrami (parametr = kanał G-Buffera)Sterowany parametrami (parametr = kanał G-Buffera) Mała customizacja oraz brak skalowalności na ilość parametrów i różne materiałyMała customizacja oraz brak skalowalności na ilość parametrów i różne materiały Wiele przebiegów kilku BRDF-ówWiele przebiegów kilku BRDF-ów Wolne ze względu na ilość przebiegówWolne ze względu na ilość przebiegów Korzystanie z material IDKorzystanie z material ID Seria IF-ów decydująca o wykonaniu BRDFSeria IF-ów decydująca o wykonaniu BRDF Kosztowna dla ALUKosztowna dla ALU Korzystanie z zapisanych BRDF-ów wraz z indexem materiałuKorzystanie z zapisanych BRDF-ów wraz z indexem materiału Textura 3D – (U,V,W) = (N.L, H.L, MaterialID)Textura 3D – (U,V,W) = (N.L, H.L, MaterialID) Wolne w odczycie Tex3D, odczyty zależne, mało funkcjonalne w trakcie produkcjiWolne w odczycie Tex3D, odczyty zależne, mało funkcjonalne w trakcie produkcji Deferred Rendering
19
Light Pre PassLight Pre Pass Przygotowanie szybkiego light bufferaPrzygotowanie szybkiego light buffera Elastyczny model materiałów i oświetleniaElastyczny model materiałów i oświetlenia Zmniejszenie obliczeń per-pixel kosztem per- vertexZmniejszenie obliczeń per-pixel kosztem per- vertex Light Pre Pass
20
Light Pre PassLight Pre Pass Przygotowanie szybkiego light bufferaPrzygotowanie szybkiego light buffera Elastyczny model materiałów i oświetleniaElastyczny model materiałów i oświetlenia Zmniejszenie obliczeń per-pixel kosztem per- vertexZmniejszenie obliczeń per-pixel kosztem per- vertex Light Pre Pass
21
LPP Depth Buffer Light Buffer Forward Rendering Normal Sortowanie Back – To - Front Frame Buffer Opaque Geometry Sortowanie Front – to - back Transparent
22
Geometry PassGeometry Pass Wypełniamy chudy g-bufferWypełniamy chudy g-buffer Normal + DepthNormal + Depth Wypełniamy Z-BufferWypełniamy Z-Buffer Lighting PassLighting Pass Wypełniamy light buffer informacjami o oświetleniuWypełniamy light buffer informacjami o oświetleniu Light Pre Pass
23
Final PassFinal Pass Renderujemy w pełni wszystkie obiekty z uwzględnieniem indywidualnych materiałówRenderujemy w pełni wszystkie obiekty z uwzględnieniem indywidualnych materiałów Korzystamy z wyliczonych / zrekonstruowanych informacji o oświetleniu z light bufferaKorzystamy z wyliczonych / zrekonstruowanych informacji o oświetleniu z light buffera Renderujemy front-to-backRenderujemy front-to-back Korzystamy z Early-Z (Z-buffer już wypełniony)Korzystamy z Early-Z (Z-buffer już wypełniony) Light Pre Pass
27
LPP Buffer LayoutLPP Buffer Layout Zależy od przyjętego modelu oświetleniaZależy od przyjętego modelu oświetlenia Normal + Depth dla Blinn PhongNormal + Depth dla Blinn Phong Normal + Depth + Material Params dla zaawansowanychNormal + Depth + Material Params dla zaawansowanych Dodatkowe informacjeDodatkowe informacje Motion VectorsMotion Vectors Chudy bufferChudy buffer Zajmuje mniej miejsca niż pełen G-BufferZajmuje mniej miejsca niż pełen G-Buffer Szybki geometry passSzybki geometry pass Szybkie liczenie oświetleniaSzybkie liczenie oświetlenia Light Pre Pass
28
LPP Buffer LayoutLPP Buffer Layout 8:8:8:88:8:8:8 Normal (8:8) + Depth I16 (8:8)Normal (8:8) + Depth I16 (8:8) 2 x 8:8:8:82 x 8:8:8:8 Normal (8+8 : 8+8)Normal (8+8 : 8+8) Depth I32 / I24 + Material ParamsDepth I32 / I24 + Material Params 2 x 8:8:8:82 x 8:8:8:8 Normal (8:8) + Motion Vectors (8:8)Normal (8:8) + Motion Vectors (8:8) Depth I32 / I24 + Material ParamsDepth I32 / I24 + Material Params Light Pre Pass
29
LPP Light Buffer – Blinn PhongLPP Light Buffer – Blinn Phong LPP Blinn Phong Channel 1 : Sum(N.L * D.Red * Att) Channel 2 : Sum(N.L * D.Green * Att) Channel 3 : Sum(N.L * D.Blue * Att) Channel 4 : Sum(N.L * (N.H)^n * Att)
30
I = Ambient + (LB123 * Diffuse + LB4 * SpecColor * SpecInt) LPP Blinn Phong Brak koloru połyskuBrak koloru połysku Zapis do poszerzonego light bufferaZapis do poszerzonego light buffera rekonstrukcjarekonstrukcja Brak obsługi połyskliwości materiałuBrak obsługi połyskliwości materiału Trzeb zrekonstruować / zapisaćTrzeb zrekonstruować / zapisać Potrzeba – Sum(N.L * Attenuation)Potrzeba – Sum(N.L * Attenuation)
31
Specular Term ColorSpecular Term Color LPP Blinn Phong
32
Specular Term ColorSpecular Term Color Kolor odzyskany z chromatyczności diffuseaKolor odzyskany z chromatyczności diffusea W przypadku pełnego zapisu specularaW przypadku pełnego zapisu speculara Light buffer – 2 x 7e3 7e3 7e3 itp…Light buffer – 2 x 7e3 7e3 7e3 itp… LPP Blinn Phong
33
Specular Term - GlossinesSpecular Term - Glossines (N.H^n)^mn * N.L * Att(N.H^n)^mn * N.L * Att Mn – połysk materiałuMn – połysk materiału Poprawne rozwiązanie – włączenie mn do równania światłaPoprawne rozwiązanie – włączenie mn do równania światła Wymaga dodatkowego miejsca w G-BufferzeWymaga dodatkowego miejsca w G-Bufferze W przypadku niektórych materiałów znacząco zwiększa koszt stworzenia G-BufferaW przypadku niektórych materiałów znacząco zwiększa koszt stworzenia G-Buffera Możliwe aproksymacjeMożliwe aproksymacje [Sum(N.H^n)]^mn * Sum(N.L * Att)[Sum(N.H^n)]^mn * Sum(N.L * Att) LPP Blinn Phong
34
PotrzebujemyPotrzebujemy Sum(N.L * Att)Sum(N.L * Att) Sum(N.H)^n = Sum(N.H)^n = Sum((N.H)^n * N.L * Att) / Sum(N.L * Att) LPP Blinn Phong
35
Specular Term - - GlossinesSpecular Term - - Glossines Komponent Sum(N.L * Att) możemy przechowywać w dodatkowym kanale Light BufferaKomponent Sum(N.L * Att) możemy przechowywać w dodatkowym kanale Light Buffera Możemy go aproksymować przez wyliczenia luminancji diffuseMożemy go aproksymować przez wyliczenia luminancji diffuse LPP Blinn Phong lum(Sum(N.L * Att * D_RGB)) ~ Sum(N.L * Att)
36
Specular TermSpecular Term Rekonstruujemy kolor oraz współczynniku połyskuRekonstruujemy kolor oraz współczynniku połysku LPP Blinn Phong lum(Sum(N.L * Att * D_RGB)) ~ Sum(N.L * Att) Approx Spec = (Chromaticity *)^mn * Sum(N.L* Att) (Chromaticity * Sum(N.H)^n)^mn * Sum(N.L* Att) Sum(N.H)^n = Sum((N.H)^n * N.L * Att) / Sum(N.L * Att)
37
Przykładowe równanie oświetlenia dla modeluPrzykładowe równanie oświetlenia dla modelu D_int oraz ApproxSpecular rekonstruowane z light bufferaD_int oraz ApproxSpecular rekonstruowane z light buffera LPP Blinn Phong
38
Przechowywanie normaliPrzechowywanie normali IdealnieIdealnie XYZ = 16:16:16 w View / World SpaceXYZ = 16:16:16 w View / World Space RealnieRealnie Ograniczona ilość miejscaOgraniczona ilość miejsca Maksymalnie 2x16BMaksymalnie 2x16B Killzone 2 : XY – 16:16 – Z odtwarzaneKillzone 2 : XY – 16:16 – Z odtwarzane Sensowne jedynie przy bardzo wysokiej jakości normal map obiektówSensowne jedynie przy bardzo wysokiej jakości normal map obiektów Standardowo chcemy się zmieścić w 8:8Standardowo chcemy się zmieścić w 8:8 LPP - Implementacja
39
Kompresja normalnych do 8:8Kompresja normalnych do 8:8 Normalne zapisujemy w View-SpaceNormalne zapisujemy w View-Space Lepsza dokładność od World SpaceLepsza dokładność od World Space 10:10:10 w WS sensowne10:10:10 w WS sensowne W kilku przypadkach znak Z może być ujemnyW kilku przypadkach znak Z może być ujemny Może się tak zdarzyć w wyniku korekcji perspektywyMoże się tak zdarzyć w wyniku korekcji perspektywy LPP - Implementacja
40
Przypadek bazowy 8:8:8Przypadek bazowy 8:8:8 LPP - Implementacja
41
Przypadek bazowy 8:8:8Przypadek bazowy 8:8:8 LPP - Implementacja half4 encode (half3 n) { return half4(n.xyz*0.5+0.5,0); } half3 decode (half4 enc) { return enc.xyz*2-1; }
42
8:8 – rekonstrukcja Z8:8 – rekonstrukcja Z LPP - Implementacja
43
8:8 – rekonstrukcja Z8:8 – rekonstrukcja Z LPP - Implementacja half4 encode (half3 n) { return half4(n.xy*0.5+0.5,0,0); } half3 decode (half2 enc) { half3 n; n.xy = enc*2-1; n.z = sqrt(1-dot(n.xy, n.xy)); return n; }
44
8:8 Sphere Map8:8 Sphere Map LPP - Implementacja
45
8:8 Sphere Map8:8 Sphere Map LPP - Implementacja half2 encode (half3 n) { half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5)); enc = enc*0.5+0.5; return enc; } half3 decode (half4 enc) { half4 nn = enc*half4(2,2,0,0) + half4(-1,-1,1,-1); half l = dot(nn.xyz,-nn.xyw); nn.z = l; nn.xy *= sqrt(l); return nn.xyz * 2 + half3(0,0,-1); }
46
Sphere Map - macroSphere Map - macro LPP - Implementacja half2 encode (half3 n) { Return normalize(N.xy)*sqrt(N.z*0.5+0.5) } half3 decode (half4 enc) { Float3 N; N.z=length2(enc.xy)*2-1 N.xy=normalize(enc.xy)*sqrt(1-N.z*N.z) }
47
Odzyskiwanie pozycji pixelaOdzyskiwanie pozycji pixela Zakładamy że mamy dostęp do głębi ekranuZakładamy że mamy dostęp do głębi ekranu Zapisana ręcznieZapisana ręcznie Odtworzona z Z-BuforaOdtworzona z Z-Bufora Odczytywana z Z-BuforaOdczytywana z Z-Bufora LPP - Implementacja
48
ZnamyZnamy Położenie pixela na ekranie – projection spacePołożenie pixela na ekranie – projection space VPOSVPOS Koordynaty tekstury ekranuKoordynaty tekstury ekranu Głębie pixelaGłębie pixela LPP - Implementacja
49
Dla wartości Z post projectionDla wartości Z post projection Z/WZ/W Jak Z-BuforJak Z-Bufor Wspierane sprzętowo – działa z Z-BuforemWspierane sprzętowo – działa z Z-Buforem Nie-liniowy rozkład głebiNie-liniowy rozkład głebi LPP - Implementacja
50
// Depth pass vertex shader output.vPositionCS = mul(input.vPositionOS, g_matWorldViewProj); output.vDepthCS.xy = output.vPositionCS.zw; //Depth pass pixel shader //Zapisuje zinterpolowane Z/W – jak Z-bufor return input.vDepthCS.x / input.vDepthVS.y; LPP - Implementacja
51
float3 VSPositionFromDepth(float2 vTexCoord) { { // Pobierz wartość głębi pixela // Pobierz wartość głębi pixela float z = tex2D(DepthSampler, vTexCoord); float z = tex2D(DepthSampler, vTexCoord); // Wylicz x/w oraz y/w z przestrzeni viewportu // Wylicz x/w oraz y/w z przestrzeni viewportu float x = vTexCoord.x * 2 - 1; float x = vTexCoord.x * 2 - 1; float y = (1 - vTexCoord.y) * 2 - 1; float y = (1 - vTexCoord.y) * 2 - 1; float4 vProjectedPos = float4(x, y, z, 1.0f); float4 vProjectedPos = float4(x, y, z, 1.0f); // Transformuj przez odwrotność macierzy projekcji // Transformuj przez odwrotność macierzy projekcji float4 vPositionVS = mul(vProjectedPos, g_matInvProjection); float4 vPositionVS = mul(vProjectedPos, g_matInvProjection); // Podziel przez w żeby uzyskać pozycje w view- space // Podziel przez w żeby uzyskać pozycje w view- space return vPositionVS.xyz / vPositionVS.w; } LPP - Implementacja
52
Mamy pozycje pixela w View-SpaceMamy pozycje pixela w View-Space World Space poprzez transformacjeWorld Space poprzez transformacje Macierz InvViewMacierz InvView LPP - Implementacja
53
Mamy pozycje pixela w View-SpaceMamy pozycje pixela w View-Space World Space poprzez transformacjeWorld Space poprzez transformacje Macierz InvViewMacierz InvView LPP - Implementacja
54
Metoda optymalnaMetoda optymalna Odzyskiwanie pozycji pixelaOdzyskiwanie pozycji pixela Zakładamy że głębia jest liniowaZakładamy że głębia jest liniowa Zapisana ręcznieZapisana ręcznie Odtworzona z Z-buforaOdtworzona z Z-bufora Liniowa głębia zapewnia równomierne rozłożenie gęstości danychLiniowa głębia zapewnia równomierne rozłożenie gęstości danych Dla obliczeń post – wygodniejsza od wersji log Z- BuforaDla obliczeń post – wygodniejsza od wersji log Z- Bufora LPP - Implementacja
55
Budowa macierzy projekcjiBudowa macierzy projekcji LPP - Implementacja
56
Jako głębie zapisujemyJako głębie zapisujemy ViewSpacePosition.ZViewSpacePosition.Z Liniowa wartośćLiniowa wartość Po ręcznym odwróceniu macierzy projekcjiPo ręcznym odwróceniu macierzy projekcji LPP - Implementacja //Vertex Shader outEyeToScreen = float3(p.x*TanHalfFOV*ViewAspect, p.y*TanHalfFOV, 1) //Pixel Shader float3 ViewPos = vtEyeToScreen*depth;
57
World space odzyskujemy podobnieWorld space odzyskujemy podobnie LPP - Implementacja //Vertex Shader outEyeToScreen = float3(p.x*TanHalfFOV*ViewAspect, p.y*TanHalfFOV, 1) outWorldEye = mul( outEyeToScreen, (float3x3)matViewInv ); //Pixel Shader float3 WorldPos = vWorldEye*depth + EyePos;
58
Podsumowanie For more information contact me hello@drobot.org Slides will be available at Drobot.org
59
Questions ?
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.