550 likes | 821 Views
Displacement mapping. Grafikus játékok fejlesztése Szécsi László 2011.03.30 . g 11 - physics. Displacement mapping. egyszer ű geometria + fel ület elmozdulások textúrában bucka leképezés [ bump mapping ] normal mapping parallax mapping sphere tracing vertex displacement.
E N D
Displacement mapping Grafikus játékok fejlesztése Szécsi László 2011.03.30. g11-physics
Displacement mapping • egyszerű geometria + felület elmozdulások textúrában • bucka leképezés [bump mapping] • normal mapping • parallax mapping • sphere tracing • vertex displacement
Elmozdulás viszonyítási rendszere • modellezési térben [object space] • egyszerű • új pos = régi pos + elmozdulás • nem jó, ha • bump map: elmozdulás mindig a normál mentén • nem 1-1 az UV leképezés • pl. ismétlődő minta • változik a felület orientációja modelltérben • pl. karakteranimáció • más vertex shader trükkök
Elmozdulás viszonyítási rendszere • érintőhöz képest [tangent space] • ki kell számítani a bázisvektorokat • normál, tangens, binormál minden vertexre Binormál: B= sv Normál: N= su x sv B x N = T N x T= B Érintő(tangens): T = su s(u,v)
Tangent frame DirectXben ki/be LPD3DXMESH D3DXComputeTangentFrameEx(mesh, D3DDECLUSAGE_TEXCOORD, 0, D3DDECLUSAGE_TANGENT, 0, D3DDECLUSAGE_BINORMAL, 0, D3DDECLUSAGE_NORMAL, 0, D3DXTANGENT_DONT_NORMALIZE_PARTIALS | D3DXTANGENT_GENERATE_IN_PLACE | D3DXTANGENT_CALCULATE_NORMALS, NULL, 0.01f, 0.25f, 0.01f, NULL, NULL); ezekbe a vertex buffer elemekbe kell rakni a számított vektorokat vektorok hossza jelezheti a texel/hossz arányt
Bump map • textúrában csak buckamagasság (elmozdulás a “sima” normál mentén) • ebből kell kiszámítani a “rücskös” normálvektort az árnyaláshoz
Normálvektor a buckaderiváltakból N Nr s(u,v): sima felület r(u,v): rücskös felület r(u,v) = s(u,v) + d(u,v) N(u,v) = ru x rv = (su+duN+d Nu) x (sv+dvN+d Nv)= su x sv + (duNx sv + dv su x N) d(u,v) N Normálvektor perturbáció N+ (du T+ dv B)
Normal map • ugyanaz, csak nem kell a deriváltakkal vacakolni, mert előre ki van számítva és letárolva float4 psNormalMapped(VS_OUTPUT IN) : COLOR { //mátrix a vektorokból float3x3 ModelToTangent = TransfModelToTangent(IN.Tangent, IN.Binormal, IN.Normal ); //tangent space normál kiolvasása float3 tNormal = tex2D(NormalMapSampler, IN.TexCoord).rgb; //világ normál float3 mNormal = normalize( mul( tNormal, ModelToTangent ) ); //ezzel lehet árnyalni ...
Parallax map • normal map + kis trükk • új pozícióval aztán normal map + texture map scale bias közelítő felület rücskös felület új textúra pozíció eredeti felület
Parallax map HLSL float3 tView = mul(ModelToTangent, worldViewDir); float h = tex2D(heightMap, tex) * HEIGHT_SCALE + HEIGHT_BIAS; float2 newTex = tex + h * tView.xy / tView.z; innen ugyanaz mint a normal map, csak az új tex koordinátát használjuk mindenre ? h tView.z tView.xy
Offset limited parallax map • Parallax meredek szögekre tView.z-vel osztás miatt nagyon messziről olvas scale bias közelítő felület rücskös felület új textúra pozíció eredeti felület
Offset limited parallax map • Legyen a max. korrekció a magasság • Hagyjuk el az osztást • ha tView.z 1, ugyanaz • ha tView.z 0, a limitálás miatt tView.xy / tView.z → tView.xy kell float h = tex2D(heightMap, tex) * HEIGHT_SCALE + HEIGHT_BIAS; float2 newTex = tex + h * tView.xy / tView.z ;
Slope parallax közelítő érintőfelület rücskös felület új textúra pozíció eredeti felület
Slope parallax float h = tex2D(heightMap, tex) * HEIGHT_SCALE + HEIGHT_BIAS; float3 tNormal = tex2D(normalMap, tex); float2 newTex = tex + h * tNormal.z / dot(tNormal, tView) * tView.xy; offset limited: float2 newTex = tex + h * tNormal.z / dot(tNormal, tView) * tView.xy;
Iteratív keresés • Magasságmező-sugár metszéspont keresés • Parallax is erre közelítés
Lineáris keresés • Első pont megtalálás legyen biztos • Relief mapping, steep parallax mapping
Extra információ map • Pyramidal displacement tracing • Sphere tracing • Cone tracing
Sphere tracing 3D textúra üres gömb sugarakkal
Cone tracing 2D textúra üres kúp nyílásszögekkel
Procedurális csúcs elmozdítás • procedurális modell • konkrét geometria helyett az azt előállító algoritmus paramétereit adjuk meg • pl. természeti jelenségek • nagy kiterjedés, nagy részletesség, összetett dinamizmus • nem működik a klasszikus munkamenet • modellező eszköz → háromszögháló + keyframe • háromszögháló megjelenítése grafikus HWen
Procedurális modell • kompakt leírás • nézetfüggő kibontás • fizikai alapokon nyugvó animáció
Procedurális modellek megjelenítése • minél később bontsuk ki a modellt • nézetfüggően • grafikus kártyán • mag-geometria rajzolása • geometria árnyaló új geometria gyártás • csúcspont árnyaló felszín változtatás • képpont árnyaló sugárkövetés • fizikai szimuláció, modell kibontása és a megjelenítés egyidőben
Példa: óceán • néhány különböző hullámhosszú hullámsorozat szuperpozíciója • nézetfüggő oceán-sík • felületi pontok elmozdítása a hullámok mechanikája alapján • sekély víz, part figyelembe vétele • partra futó hullámok, hab • tarajos hullámok • lebegő testek
Nyílt víz • a nyílt óceánon a felületi cseppecskék körmozgást végeznek • trochoid hullámforma hullámhossz gerinc amplitúdó hullámmagasság völgy csepp pályája hullám terjedése
Billboard vágási problémák részecske billboard
Billboard felbukkanási problémák Frame A Frame B
Mélység kép: Spherical billboards
A grafikus kártya képességei • GPU • nagy teljesítmény • párhuzamosítás • pipeline • korlátok • inkrementális képszintézisre alkották • pár regiszternyi memória • korlázott dinamikus program-végrehajtás (flow control: if, while)
Képszintézis pixel
A sugárkövetés szerepe • sugárkövetés • képszintézis • árnyalási egyenlet numerikus megoldása • minták: fényutak • legáltalánosabb módszer: sugárkövetés • globális illuminációs módszerek • photon tracing • photon map • virtuális fényforrások
Láthatóság a szemből pixel ray(t) = eye + v ·t, t > 0 FirstIntersect(ray t, iobject, x) t = FLT_MAX; FOR each object tnew = Intersect( ray, object ); // < 0 if no intersection IF (tnew > 0 && tnew < t ) t = tnew, iobject = object ENDFOR IF (t < FLT_MAX) x = eye + v ·t; RETURN (t, iobject, x); RETURN „no intersection” END
Sugárkövetés primitívjei • olyan alakzatok, amire a sugár-objektum metszéspont-számítás elvégezhető • sík • kvadratikus felületek xAxT = 0 • gömb, ellipszoid, henger, kúp, etc. • tórusz • háromszög • az interaktív grafikában úgyis háromszöghálókkal kell dolgoznunk
Metszéspont számítás: háromszög r3 p r1 r2 r1 1. Síkmetszés: (ray(t) - r1) ·n = 0, t > 0 normál: n = (r2 - r1) x (r3 - r1) 2. A metszéspont a háromszögön belül van-e? ((r2 - r1) x (p - r1)) ·n > 0 ((r3 - r2) x (p - r2)) ·n > 0 ((r1 - r3) x (p - r3)) ·n > 0 Felületi normális: n vagy „shading normals”
a b c Sugár-háromszög metszés • három feladat • sugár-sík metszéspont • pont-háromszög tartalmazás • csúcsokban adott értékek interpolálása • textúra-koordináták • normálvektorok • kettőt egy csapásra • baricentrikus koordináták számítása p
Sugár-háromszög metszés • v1·a+ v2·b + v3·c = p • [a b c] = p[v1 v2 v3]-1 • IVM • ideális háromszög-reprezentáció • a síkegyenlet is könnyenszámolható belőle • IVM → sík → metszéspont → baricentrikus koordináták → interpoláció
Transzformált objektumok T1 T1-1 T2 T2 -1
Sugárgép [ray engine] sugár textúra sugár találatok RT primitívek fetch z-test Pixel shader ray-primitive intersection draw full screen quad