Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Aleš Borek ALTAR interactive

Podobné prezentace


Prezentace na téma: "Aleš Borek ALTAR interactive"— Transkript prezentace:

1 Aleš Borek ALTAR interactive
Lightmapy Aleš Borek ALTAR interactive

2 Obsah Úvod Mapování texturových souřadnic Rozložení do textury
Softwarové osvětlení Hardwarové po jednotlivých polygonech Hardwarové přes shadowmapy Techniky na zlepšení kvality

3 Co to je? Stará technika na zlepšení vizuálního dojmu
Druhá textura – barva světla, jak svítí na daný bod Rychlé, dobrý poměr cena/výkon Nemá smysl kreslit přímo do hlavní textury Není nutno použít fixní pipeline Bodové osvětlení / radiosita

4 S lightmapou a bez ní

5 Vytváření Dvě nezávislé fáze
Namapování texturových koordinát a umístění v textuře Vlastní olightmapování (přiřazení barvy jednotlivým texelům)

6 Namapování souřadnic – od grafiků
Teoreticky možno použít namapování od grafiků pro první texturu Možné problémy se spojováním a scalingem Může se ale lépe využít textura a může to vypadat lépe Propagace chyb od grafiků

7 Namapování souřadnic Rozdělení geometrie do šesti skupin podle rovin x, -x, y, -y, z, -z Mapování pak není úplně přesné (koule) Problém u terénu Lightmapa se na tyto trojúhelníky bude nanášet, jako bychom se na ně dívali z příslušné roviny

8 Přiřazení souřadnic Spojení sousedních trojúhelníků z jedné skupiny do grupy Vyhledávání po hranách Grupa zabere vždy obdélníkový prostor Snadno spočítáme výšku a šířku v textuře, ale je problém tam tu grupu zařadit

9 Zařazení grupy do textury
NP-úplný problém: jak ideálně zaplnit texturu? My používáme stromovou strukturu Poté někdy off-line algoritmus na obecnou optimalizaci textur Další problémy Prázdný prostředek Šikmé trojúhelníky

10 Vlastní ligtmapování Softwarově přes kolizní strukturu
Po trojúhelnících pomocí karty (nejsou nutné shadery) Použitelné pro radiositu Pomocí shadowmap přes shadery

11 Softwarové lightmapování
V UFO: Aftermath Pro každý texel vedu přímku ke zdroji světla – když narazí – jsem ve stínu; jinak ve světle Světlo: barva * normála.DotProduct(lv) Kolize přes BSP-stromy Zrychlení: po trojúhelnících; průnik čtyřstěnu s geometrií; poté s jednotlivými trojúhelníky

12 Softwarové lightmapování
Výhody Velké rozlišení možné při výpočtu (ne omezení 2048x2048) Lepší kontrola Nevýhody rychlost

13 Aplikace lightmapy Barva textury * barva lightmapy * 2
Tímto jsme schopni dosáhnout určitého přesvícení Možné samozřejmě i jiné aplikace (např. přičítání) I bez shaderů

14 Lightmapování pomocí karty
Pokud se na trojúhelník, který osvětlujeme, díváme z pohledu světla a okolní geometrii vykreslíme černě, dostaneme přesně to, co chceme Pokud do vertexů dáme správné barvy (a příslušně vykreslujeme), není nutné používat shadery Textury pro každé světlo spojíme buď screen metodou (a+b*(1-a)) nebo přičtením

15 Trojúhelníky – bodové světlo
Pro bodové světlo: nastavení pohledového jehlanu Obrácená normála trojúhelníku je směr pohledu – aby měl hloubku konstantní, jinak by to nevyšlo přesně: glLookAt(pozice, pozice-normála, up_vektor); glFrustum(minx*tz, maxx*tz, minz*tz, maxy*tz, nearz, maxz+1.0f); kde tz = nearz/maxz a min*, max* jsou minima a maxima 3d-souřadnic po pronásobení kamerou a nearz = 1.0f

16 Trojúhelníky – bodové světlo
Obr.: světlo osvětlovaný trojúhelník textura

17 Trojúhelníky – paralelní světlo
Pro paralelní světlo: nastavení pohledového jehlanu Směr opět obrácená normála – ne směr světla, projekční matici ale nutno odvodit (sx = minx – bod.x, sy = miny – bod.y) projection_matrix.a00 = 2/(maxx-minx); projection_matrix.a01 = 0; projection_matrix.a02 = 2*(minx-sx)/(maxz*(maxx-minx)); projection_matrix.a03 = -2*sx/(maxx-minx)-1; projection_matrix.a10 = 0; projection_matrix.a11 = 2/(maxy-miny); projection_matrix.a12 = 2*(miny-sy)/(maxz*(maxy-miny)); projection_matrix.a13 = -2*sy/(maxy-miny)-1; projection_matrix.a20 = 0; projection_matrix.a21 = 0; projection_matrix.a22 = -2/maxz; projection_matrix.a23 = -1;

18 Kreslení trojúhelníků - výhody
Při lightmapování se využije rychlá grafická karta Možno použít i barevná skla (nekreslila by se černě, ale v příslušné barvě, nutno mít setříděnou geometrii) Použitelné i pro radiositu Není nutné použít shadery

19 Kreslení trojúhelníků - nevýhody
Nutno pracovat po trojúhelnících a ne po celých skupinách (jen když mají stejnou normálu) Při velkých grupách opět omezení velikostí pamětí na kartě Rychlost není ještě ideální

20 Shadowmapy – paralelní světlo
Používá technologii shadowmap (pro dynamické zobrazení stínů) při počítání lightmap Scéna se vykreslí v ortogonálním zobrazení ve směru světla do shadowmapy – zapisuje se jenom z-buffer (v přesnosti 24 nebo 32 bitů) Při kreslení texelu se spočítá jeho z-hodnota v původním ortogonálním zobrazení a porovná se s tou spočítanou – pokud je větší, je bod ve stínu

21 Shadowmapy – paralelní světlo

22 Shadowmapy – lightmapování
Pro každou grupu se nastaví modelview matice podle roviny, do které byla grupa promítnuta, projekční matice zůstává identita Musíme nastavit jen správně shadery, aby se při renderování grupy brala do úvahy shadowmapa pro dané světlo

23 Shadowmapy – bodové světlo
Nestačí jedna shadowmapa, protože bodové světlo obsáhne celý prostor Možnosti Sférické – jen jedna shadowmapa, velice nepřesné Cube-mapa – šest shadowmap Dual-parabolické – dvě shadowmapy; používáme

24 Shadowmapy – dual-parabolické
Používají se dva paraboloidy (f(x,y) = ½ - ½(x2 + y2)), které zachytí celou scénu

25 Shadowmapy – dual-parabolické

26 Dual-parabolické - implementace
uniform vec3 lightPos; uniform float sign; uniform float maxDepth; void main(void) { vec4 transfP = gl_ModelViewMatrix * gl_Vertex; vec3 P = lightPos - transfP.xyz; P.z *= sign; if (P.z <= -0.5) P.z = -maxDepth-1.0; P = normalize(P); P.z += 1.0; vec4 OutPos; OutPos.x = P.x / P.z; OutPos.y = P.y / P.z; OutPos.z = (length(P.xyz) - gl_DepthRange.near) / gl_DepthRange.diff ; OutPos.z = (OutPos.z / maxDepth) * ; OutPos.w = 1.0; gl_Position = OutPos; }

27 Dual-parabolické - problémy
Tam, kde nastává řez (v našem případě rovina z), na sebe nemusí navazovat trojúhelníky: nutno zde rozříznout geometrii Geometrie musí být hodně teselovaná: v našem případě není problém Není to moc přesné

28 Dual-parabolické - problémy

29 Filtrování textur Díky filtrování textur (aby byly rozmazanější) je nutné zabarvit černé pixely u okraje textury grupy Pokud nebylo do bodu textury zapsáno (zjištěno pomocí alphy), uděláme průměr z okolních bodů a bod vyplníme Možno dělat jako filtrování shaderem, v našem případě ještě přidáme ambientní složku

30 Filtrování textur - obrázek

31 Paralelní světlo - implementace
Vertex shader varying vec3 normal; uniform mat4 shadowCam; void main(void) { gl_Position = ftransform(); normal = gl_Normal; gl_TexCoord[0] = gl_ModelViewMatrix * gl_Vertex * shadowCam; } Fragment shader uniform vec4 lightColor; uniform vec3 lightDir; varying vec3 normal; uniform sampler2DShadow shadowMapTex; vec3 L = -normalize(lightDir); vec3 N = normalize(normal); float shadowTerm = shadow2DProj(shadowMapTex, gl_TexCoord[0]).r; gl_FragColor.rgb = lightColor.rgb * max(dot(N, L), 0.0) * shadowTerm; gl_FragColor.a = 1.0;

32 Paralelní světlo - implementace
shadowCam bias matice (převádí z [-1, 1] na [0, 1]) * projekční matice kamery světla renderovaného do shadowmapy * pohledová matice kamery světla renderovaného do shadowmapy * inverzní pohledová matice současné kamery

33 Bodové světlo - implementace
uniform sampler2DShadow shadowMapTex2; uniform sampler2DShadow shadowMapTex; uniform float endRad; uniform float fullRad; uniform vec4 lightColor; varying vec3 normal; varying vec3 Pos; void main(void) { float k; float lvLen = length(Pos); vec3 L = normalize(Pos); vec3 N = normalize(normal); float attenuation = min((max(lvLen - fullRad, 0.0))/(endRad - fullRad), 1.0); float Alpha = ((Pos.z / endRad) >= 0.0)? 1.0: -1.0; float ZValue = (lvLen - gl_DepthRange.near) / gl_DepthRange.diff; vec3 tPos = L;

34 Bodové světlo - implementace
tPos += vec3(0.0, 0.0, Alpha); tPos.x /= (tPos.z * -Alpha); tPos.y /= (tPos.z * -Alpha); tPos.xy = vec2(0.5, 0.5) * tPos.xy; tPos.z = ZValue/endRad; if (Alpha >= 0.0) { k = shadow2D(shadowMapTex2, tPos).r; } else { k = shadow2D(shadowMapTex, tPos).r; gl_FragColor.rgb = lightColor.rgb * attenuation * max(-dot(N, L), 0.0) * k; gl_FragColor.a = 1.0;

35 Shadowmapy - výhody a nevýhody
Relativní rychlost – pro jedno světlo „konstantní“ čas – dokonce ani tolik nezáleží na tom, jestli světlo vrhá stín nebo ne Omezení velikostí texturové paměti (hlavně u shadowmapy) – menší kvalita Nemožnost barevných skel Rozdíly u ATI a n-Vidie

36 Supersampling Použitelné jen u softwarových lightmap díky paměťovým omezením Jeden texel v lightmapě odpovídá 4, 9, 16, … texelům při výpočtu – je jejich průměrem

37 Multisampling Pro každé světlo se lightmapa vypočítá vícekrát – světlo je trochu vždy trošku posunuté Lépe řeší světlo těsně u stěny Opět zvýší kvalitu bez nutnosti mít velkou texturovací paměť Ještě jsme neimplemetovali

38 Perlin-noise Lightmapa se dá využít i pro šum – zbytečné plýtvat další texturou Pomáhá rozbít repetitivnost u velkých ploch, kde se opakuje textura, protože lightmapa se neopakuje

39 Aplikace lightmap Texel v lightmapě nemusí kódovat pouze barvu
Jednou z možností je do barevné složky (R, G, B) zakódovat intenzitu světla – a při aplikaci pixel-shaderem vynásobit se skutečnou barvou světla: možno udělat například rozžínající se a plápolající oheň

40 Aplikace lightmap - příklad

41 On-line přepočítávání lightmap
Nutno mít přesně označeno, které grupy a která světla se musí přepočítat – většinou se to předpočítává Použitelné i u softwarových lightmap – UFO: Aftermath Pro UFO: Aftershock ještě nevíme

42 Reference GameDeveloper – August 2004 pg.22-28; Brian Ramage: Fast Radiosity using Pixel Shaders Brabec, Annen, Seidel: Shadow Mapping for Hemispherical and Omnidirectional Light Sources


Stáhnout ppt "Aleš Borek ALTAR interactive"

Podobné prezentace


Reklamy Google