Plakátok, részecskerendszerek Szécsi László
Képalapú festés Montázs: képet képekből 2D grafika jellemző eszköze modell: kép [sprite] 3D 2D képével helyettesítsük a komplex geometriát Image-based rendering
A sprite evolúciója C64 2D grafika hardver támogatás: 8db 24x21-es bitmap kirakása adott pixelkoordinátákra nincs elforgatás, skálázás blitter: bit block transfer sprite mem frame buffer
A sprite evolúciója modern grafikus pipelineban pont primitívek rajzolása [point sprite] pont mérete [p p pixeles négyzet]: D3DRS_POINTSIZE pixel shaderben olvasható a kép mint textúra Shader Model 4.0 point sprite már nincs, mivel háromszögekkel is megoldható (minek foglalja a tranzisztorokat)
A sprite evolúciója 3D grafikában a 2D sprite 3D geometriát helyettesít [impostor] képernyőtérbeli quad, de skálázható, mérete a távolság függvényében változhat rendelhető hozzá mélység, z-teszt használható rá világkoordinátákban adott pozíció, méret, de mindig a kamera felé fordul
Sprite rajzolása klasszikus trafókkal a sprite modellje egy z irányba néző quad a világban úgy forgatjuk a quadot, hogy a kamera fele nézzen a kamera trafó forgatás részét ki kell iktatni kamera trafó inverz transzponáltjával kell a quad vertexeit transzformálni utána jöhet a kamera trafó és projekció csak akkor van értelme ha a kamera trafó végrehajtásába nem tudunk belenyúlni
Sprite rajzolása klasszikus trafókkal modell trafóban nincs elforgatás mert a spritenak nincs orientációja view elforgatás kiiktatása ez változatlan maradhat sprite model trafó model eltolás inverz tr. view trafó view trafó proj trafó modellezési koordináták model space temp. világkoordináták world space világkoordináták world space kamera koordináták camera space norm. képernyő koordináták clip space norm. device space z irányba néző quad z irányba néző quad kamera felé néző quad z irányba néző quad 2D quad
Sprite rajzolása saját trafóval a modellezési origót [sprite középpontjának a pozícióját] transzformáljuk a kamera koodinátarendszerbe kamera koordinátákban adjuk hozzá a csúcsok (spriteon belüli) pozícióit utána jöhet a proj trafó
Sprite rajzolása saját trafóval kamera koordináták camera space vertex shaderben a view trafó után adjuk hozzá a quad vertex pozíciókat z irányba néző quad model trafó view trafó proj trafó Σ modellezési koordináták model space világkoordináták world space kamera koordináták camera space norm. képernyő koordináták clip space norm. device space 0,0,0 sprite pozíció sprite pozíció 2D quad
Vertex shader sprite rajzolásra struct vsspriteinput { float4 quadvertexpos: TEXCOORD0; float2 tex : TEXCOORD1; float3 spritepos : POSITION; float age : TEXCOORD2 }; struct vsspriteoutput { float4 pos float2 tex float age } : POSITION; : TEXCOORD0; : TEXCOORD1;
Vertex shader sprite rajzolásra vsspriteoutput vssprite(vsspriteinput input) { float3 cameraspritepos = mul(input.spritepos, viewmatrix); float3 cameravertexpos = cameraspritepos + input.quadvertexpos; output.pos = mul( float4(cameravertexpos, 1), projmatrix); output.tex = input.tex; output.age = input.age; }
Plakát [billboard] sprite mindig teljesen a kamera fele néz a plakát is egy textúrázott quad lehet statikus foroghat 1 tengely körül illeszkedhet felületre stb. billboard általánosabb, mint a sprite
Statikus plakát 3D objektumok megjelenítésére önmagában gyenge, ha rossz irányból nézünk rá sok felületből már meggyőző modell lehet plakátfelhő [billboard cloud]
Tengely körül forgó plakát tipikus alkalmazás: fák
Részecske-rendszer térfogati jelenségek pl. tűz, füst, köd, por, sugárhajtómű bonyolult fizika, áramlás-szimuláció, Navier- Stokes difegyenlet helyett szimuláljuk néhány részecske útját az áramlásban egyszerű szabályok alapján jelenítsük meg őket mint felhőcskéket áttetsző, textúrázott plakátokkal billboard + blending + instancing [sok ugyanolyan geometria]
Részecskék életciklusa születés emitter: pontszerű, vonalas, sík, térfogat jellemzők pozíció, sebesség, életkor, méret, szín, átlátszóság hatások effector: szél, felhajtóerő, turbulencia, gravitáció halál
Bufferek LPDIRECT3DINDEXBUFFER9 billboardindexbuffer; LPDIRECT3DVERTEXBUFFER9 billboardvertexbuffer; alap geometria LPDIRECT3DVERTEXBUFFER9 particleinstancebuffer; példány adatok LPDIRECT3DVERTEXDECLARATION9 particlesystemvertexdecl; vertex layout
Részecske osztály class Particle { D3DXVECTOR3 pos; D3DXVECTOR3 velocity; float age; }; void move(double dt);...
Vertex layout D3DVERTEXELEMENT9 particlesystemvertexelements[] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3}, {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4}, {1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {1, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1}, {1, 24, D3DDECLTYPE_FLOAT, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2}, D3DDECL_END() }; quad particle device->createvertexdeclaration( particlesystemvertexelements, &particlesystemvertexdecl);
Quad összerakása vertex buffer, index buffer létrehozása lock feltöltés unlock
Instance buffer device->createvertexbuffer( sizeof(particle) * nmaxparticles, D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &particleinstancebuffer, NULL);
Rajzolás instancinggel device->setstreamsourcefreq( 0, D3DSTREAMSOURCE_INDEXEDDATA nparticles); device->setstreamsource(0, billboardvertexbuffer, 0, sizeof(float) * 5); device->setindices(billboardindexbuffer); ennyi példány ebből device->setstreamsourcefreq( 1, (unsigned)(d3dstreamsource_instancedata 1)); device->setstreamsource(1, particleinstancebuffer, 0, sizeof(particle)); device->setvertexdeclaration(particlesystemvertexdecl); példányonkénti adatok device->drawindexedprimitive(d3dpt_trianglelist, 0, 0, 4, 0, 2); device->setstreamsourcefreq(0, 1); device->setstreamsource(1, NULL, 0, 0); vertex shaderbe melyik bufferből honnan jön a paraméter