Grafikus játékok fejlesztése Szécsi László 2011.03.30. g11-physics 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 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 + (duN x 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 bias scale 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
Bump és parallax
Offset limited parallax map Parallax meredek szögekre tView.z-vel osztás miatt nagyon messziről olvas bias scale 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 ;
Parallax és offset limited parallax
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:
Offset limited parallax és slope parallax
Iteratív keresés Magasságmező-sugár metszéspont keresés Parallax is erre közelítés
Iteratív parallax
Slope parallax és iteratív parallax
Bináris keresés
Bináris keresés
Szekáns keresés
Lineáris keresés Első pont megtalálás legyen biztos Relief mapping, steep parallax mapping
Lineáris keresés
Extra információ map Pyramidal displacement tracing Sphere tracing Cone tracing
Sphere tracing 3D textúra üres gömb sugarakkal
Sphere tracing
Cone tracing 2D textúra üres kúp nyílásszögekkel
Cone tracing
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 csepp pályája völgy hullám terjedése
2.5D imposztorok Gömbplakátok
Billboard vágási problémák részecske billboard
Billboard felbukkanási problémák Frame A Frame B
Spherical billboards Mélység kép:
Sugárkövetés a GPUn
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 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 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”
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 a b c
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önnyen számolható belőle IVM → sík → metszéspont → baricentrikus koordináták → interpoláció
Transzformált objektumok
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
Térfelosztás objektumok Elő- feldolgozás Sugár követés Térpartícionáló adatstruktúra Első metszéspont Adatstruktúra: Ha ismert a sugár, akkor a potenciális metszett objektumok számát csökkenti Ha a potenciálisak közül találunk egyet, akkor a többi nem lehet közelebb
Reguláris térháló előfeldolgozás bejárás minden cellára objektumlista következő cellára lépés minden objektumra a cellában metszéspontszámítás ha van metszésont a cellán belül, kész
kd-fa kd-fa bináris fa [BSP], koordinátasíkokkal párhuzamos vágósíkok „legjobb” térfelosztás színtértől függetlenül hatékony érzéketlen a „teáskanna a stadionban” esetre
kd-fa rekurzív bejárása sugárkövetés: rekurzív bejárás GPU: verem nélkül minden cella után a gyökérből indulva rosszabb mint a CPU implementáció Verem
A laza kd-fa klasszikus objektum tartozhat több cellához kilóghat a cellájából levél-lista bonyolult extra ellenőrzések laza cellák átlapolódhatnak objektum csak egy cellában nem lóghat ki egyetlen rendezett tömb két metszéspont párhuzamosan