Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Jeni László Attila jedi@inf.elte.hu Klár Gergely tremere@elte.hu
„Mappings” 2. Jeni László Attila Klár Gergely
2
Miről lesz szó? Bump mapping, Normal mapping Displacement mapping
Environment mapping
3
Bucka és normál leképzés
Feladat: részletgazdagabbá akarunk tenni egy felületet, hogy apró egyenetlenségek is meglátszódjanak rajta, miközben a geometriát nem akarjuk megváltoztatni
4
Bucka és normál leképzés
Tároljuk a felületi normálvektor perturbációt egy térképben. Ezeket az információkat felhasználva árnyalásnál módosítjuk a visszaverődő S vektor irányát (és ezáltal a megfigyelő által észlelt fényerő mértékét). Nem módosítunk a geometrián.
5
Bucka és normál leképzés
Bucka térkép Normál térkép
6
Bucka leképzés
7
Bucka térkép előállítása
A nagyobb tesszellációval rendelkező modell segítségével meghatározhatjuk a bucka térképeket a kisebb tesszelláltságú modellhez.
8
Bucka térkép előállítása
Procedurális textúrák segítségével Rajzoló programmal
9
Normál térkép használata
A kép RGB csatornáin XYZ értékeket tárolunk Ezek értéke [0,1] tartományban lehet De egy normálvektor koordinátái [-1, 1] között vehetnek fel értéket! NormalVector = (NormalTexture-0.5)*2
10
Normál térkép használata
Az így kapott vektor adja az adott pontbeli normálvektor. Probléma: fontos a normál térkép sodrása! Jobbkezes térkép balkezes rendszerben hibás árnyékokat eredményez, és viszont!
11
Textúra és világ koordináta rendszerek
A normál térképben tárolt vektorok a textúra síkjához képest adottak, azaz helyes értéket (transzformációk nélkül) csak az XY síkon fekvő, és a +Z felelő néző objektumokra adnak
12
Normál térképek transzformálása (Texture-Space Normal Mapping)
A probléma, hogy a textúra-tér és az objektum-tér inkonzisztens egymással Egy megoldás, ha az fény számításnál használt vektorokat (directionToLight, directionToCamera) elforgatjuk a textúra-térbe. Ez csak ritkán használható megoldás, mivel az elforgatás csak objektumonként adott, de nekünk felületenként (gyak. háromszögenként) lenne rá szükségünk
13
Texture-Space Normal Mapping
14
Normál, tangens, bitangens
Egy forgatási mátrix megadható a fenti három vektor segítségével Célunk, hogy a textúra-tér XY síkja a „normál leképezés alá kerülő” háromszög síkjába kerüljön Ha ismert a fenti három vektor, akkor belőlük képzett forgatási mátrix pontosan ezt a transzformációt végzi el.
15
Normál, tangens, bitangens vektorok számítása
Ha a háromból kettő adott, akkor a harmadik számítható az alábbi képletek alapján: N általában adott Sok 3D-s program támogatja a tangens és/vagy bitanges exportálását A bitangest (tévesen) szokás néha binormálisnak is nevezni
16
További olvasnivalók Leírás a bucka illetve normál leképezésekről, shader kódokkal: Tangens, bitangens vektorok számítása:
17
Eltolás leképzés Displacement mapping
A textúrázást felhasználhatjuk arra is, hogy elmozdítsuk az objektum felületi pontjait.
18
Előnyök, hátrányok Valóban megváltoztatja a felület geometriáját, nem csak azt az érzetet kelti Ellenpélda normál leképezésnél: Csak annyira lesz részletes, amennyire a felület felbontása az:
19
Környezet leképzés Tükröző és törő felületű objektumok modellezésére használhatjuk. Nem szükséges hozzá pontos fizikai modellezés Visszaverődő sugár: A kamerából induló nézeti fénysugár és az objektum metszéspontjához a visszaverődő fénysugár és a közvetítőfelület metszéspontját rendeljük (environment mapping ).
20
Környezet leképzés Gömbi leképzéssel:
21
Környezet leképzés Blinn-Newell leképzéssel:
22
Környezet leképzés Kocka leképzéssel:
23
Kocka textúrák A kocka textúrák (cube maps) különleges, hat lapból álló textúrák, amik három koordinátával címezhetők. A hat lap a +X, -X, +Y, -Y, +Z, -Z irányoknak felelnek meg, mindegyik egy lapja a kockának.
24
Környezet leképzés, tükröződés
A kocka leképzéssel bonyolult transzformációk nélkül megkaphatjuk a textúra koordinátákat. Az kocka textúra megfelelő pontját a kamerába mutató vektor normál vektorra vett tükörképe adja. A kapott pontból kell olvasni a textúrából float3 R = reflect(-directionToCamera, input.Normal); float4 envColor = texCUBE(envMapSampler, R);
26
Környezet leképzés, fénytörés
Hasonlóan járunk el, mint a tükröződés esetén Fénytörés során, a sugár elhajlását a Snellius–Descartes-törvény adja, ami szerint Az kocka textúra megfelelő pontját a refract függvény adja. A kapott pontból kell olvasni a textúrából float3 R = refract(-directionToCamera, input.Normal, 1.01); float4 envColor = texCUBE(envMapSampler, R);
28
További környezet leképzésen alapuló technikák
Chromatikus diszperzió R,G,B csatornánként külön számítjuk a fénytörés, kissé eltérő törésmutatókkal. Példa kód: float4 envColor = 1; float3 R = refract(-directionToCamera, input.Normal, 1.01); envColor.r = texCUBE(envMapSampler, R).r; R = refract(-directionToCamera, input.Normal, 1.04); envColor.g = texCUBE(envMapSampler, R).g; R = refract(-directionToCamera, input.Normal, 1.07); envColor.b = texCUBE(envMapSampler, R).b;
30
További környezet leképzésen alapuló technikák
Fresnel hatás Egyszerre használunk tükröződést illetve fénytörést A visszavert és átengedett fény arányát a beesési szög és az anyagjellemzők határozzák meg Példa kód: float power = 5; float reflectionCoefficient = max(0, min(1, 1-pow(dot(directionToCamera, input.Normal), power))); float3 Rfl = reflect(-directionToCamera, input.Normal); float3 Rfr = refract(-directionToCamera, input.Normal, 1.05); float4 envColor = reflectionCoefficient*texCUBE(envMapSampler, Rfl)+(1-reflectionCoefficient)*texCUBE(envMapSampler, Rfr);
32
További környezet leképzésen alapuló technikák
SkyBox/SkySphere Egy olyan modellt hozunk létre, ami teljesen tartalmazza a színteret, végtelenül távol van, elérni nem lehet, de „forgásra” változik. Ehhez a verex shader-ben a modellt eltoljuk a hátsó vágósíkhoz, textúra-koordinátáknak pedig a csúcspontok eredeti pozícióit használjuk.
33
További környezet leképzésen alapuló technikák
SkyBox/SkySphere Példa kód: void VertexShaderFunction(float3 Position : POSITION0, out float4 SkyPos : POSITION0, out float3 SkyCoord : TEXCOORD0) { float3 worldPosition = mul(Position, World); float3 viewPosition = mul(worldPosition, View); SkyPos = mul(float4(viewPosition, 1), Projection).xyww; SkyCoord = Position; }
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.