Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László 2011.03.07. g09-billboard.

Slides:



Advertisements
Hasonló előadás
OpenGL 2. gyakorlat Hapák József
Advertisements

GraphGame gg001-Triangle
Geometriai Transzformációk
Analitikus (koordináta) geometriai gyorstalpaló
Geometriai transzformációk
Inkrementális 3D képszintézis
GPU Szirmay-Kalos László.
Geometriai modellezés
Geometriai modellezés
Számítógépes grafika Szirmay-Kalos László
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Számítógépes grafika Szirmay-Kalos László
Bevezetés.  A számítógépes grafika inkrementális képszintézis algoritmusának hardver realizációja  Teljesítménykövetelmények:  Animáció: néhány nsec.
Grafikus játékok fejlesztése Szécsi László g11-physics
Mesh betöltés, kirajzolás Szécsi László. dx11-ben nincs – játékfejlesztők írnak maguknak úgyis DXUT-ban van – CDXUTSDKMesh – csak sdkmesh formátumot tud.
Transzformációk kucg.korea.ac.kr.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, D képszintézis 4. előadás.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
3. Vetületi ábrázolások számítási eljárásai
Számítógépes grafika 3. gyakorlat.
Számítógépes Grafika Programtervező informatikus (esti)‏ Textúrázás.
2008/2009 tavasz Klár Gergely  Gyakorlatok időpontjai: ◦ Szerda 10:05–11:35 ◦ Csütörtök 10:00+ε –11:30+ε  Gyakvez: ◦ Klár Gergely ◦
Térfogatvizualizáció Szirmay-Kalos László. Térfogati modellek v(x,y,z) hőmérséklet sűrűség légnyomás potenciál anyagfeszültség... v(x,y,z) tárolás: 3D.
Grafikus alaphardver Szirmay-Kalos László. Jelfeldolgozási megközelítés modellezés modell képszintézis Digitális kép megjelenítés Analog Digitál Képinformáció.
Térfogatvizualizáció
Terep Szécsi László. Mechanizmus NxHeightField-ek definiálása PhysicsModel-be NxHeightFieldShapeDesc-ek betöltése Mesh-ek gyártása az NxHeightField- ekből.
Fraktálok és csempézések
DirectX9 empty project Szécsi László. Visual Studio Első indításkor C++ választása.
Motor I. Scene graph XML Rendering Szécsi László.
Environment mapping Szécsi László. Új osztály: Lab3EnvMap copy&paste: Lab2Trafo.h -> Lab3EnvMap.h copy&paste: Lab2Trafo.cpp -> Lab3EnvMap.cpp copy&paste:
Vízfelület Szécsi László. Nyílt víz a nyílt óceánon a felületi cseppecskék körmozgást végeznek trochoid hullámforma hullámhossz hullámmagasság amplitúdó.
Transzformációk, textúrák, árnyalás Szécsi László.
2D képszintézis Szirmay-Kalos László.
Analitikus geometria gyorstalpaló
Számítógépes grafika Bevezetés
Rendering pipeline Ogre3D
Textúrák Grafikus játékok fejlesztése Szécsi László g07-texture.
Kamera, 3D, transzformációk Szécsi László. Math.zip kibontása az Egg projectkönyvtárba – float2, foat3, float4 típusok, HLSL-ben megszokott műveletekkel.
Megjelenítő-motor, színtér- menedzsment Szécsi László.
Effect framework, HLSL shader László Szécsi. forráskódban elérhető egyszerűsíti a shaderek fordítását, rajzolási állapot beállítását – pass: egy ilyen.
Többmenetes renderelés Grafikus játékok fejlesztése Szécsi László g11-multipass.
Grafikus játékok fejlesztése Szécsi László t09-texture
Geometry instancing Szécsi László. copy-paste-rename gg009-Gui folder vcxproj, filters átnevezés solution/add existing project rename project working.
Textúrázás Szécsi László. giraffe.jpg letöltése SolutionDir/Media folderbe.
Inkrementális 3D képszintézis
3. Vetületi ábrázolások számítási eljárásai
OpenGL 4 shaderek, GLSL Valasek Gábor
GPGPU A grafikus hardver általános célú felhasználása
Jeni László Attila Klár Gergely
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
Bevezetés a számítógépi grafikába 2. Paraméteres görbék Paraméteres görbe: 2D-ben: paraméter: általában: kikötések: legyen folytonos legyen folytonosan.
Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010 Geometriai modellezés 2. előadás.
Számítógépes grafika gyakorlat: DirectX 2007/2008 tavasz Klár Gergely
Számítógépes Grafika OpenGL 4 shaderek, GLSL. OpenGL 4 A következő programozható fázisok vannak a 4.x-es OpenGL-ben: Vertex shader Tesselation control.
Képek, képfeldolgozás Szirmay-Kalos László.
Perspektív projekció és kamera paraméterek. Szükséges transzformációk Világkoordináta rendszer (3D) Kamera koordinátarendszer (3D) Képsík koordináták.
Bevezetés.  Miért …  … egyszálúan programozunk?  … probléma ez?  Hogyan …  … változik ez?  … tudjuk kihasználni?  Megéri-e párhuzamosítani?
Térfogati illumináció
A grafikus hardware programozása
OpenGL 2. gyakorlat Valasek Gábor
Grafikus Rendszerek 6. Camera.
Vizualizáció és képszintézis
Vizualizáció és képszintézis
GPGPU – CUDA 2..
Kamera, 3D, transzformációk Szécsi László
World map.
Direct3D DirectCompute
Bevezetés GPGPU Alkalmazások.
Environment mapping Szécsi László
Előadás másolata:

Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard

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 inverz tr. view trafó modellezési koordináták model space temp. világ- koordináták world space view trafó kamera koordináták camera space proj trafó norm. képernyő koordináták clip space norm. device space z irányba néző quad kamera- irányba néző quad modell trafóban nincs elforgatás mert a spritenak nincs orientációja világ- koordináták world space kamera felé néző quad model eltolás z irányba néző quad 2D quad view elforgatás kiiktatása sprite model trafó ez változatlan maradhat

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áta-rendszerbe – kamera koordinátákban adjuk hozzá a csúcsok (spriteon belüli) pozícióit – utána jöhet a proj trafó

kamera koordináták camera space Sprite rajzolása saját trafóval model trafó modellezési koordináták model space világ- koordináták world space view trafó kamera koordináták camera space proj trafó norm. képernyő koordináták clip space norm. device space 2D quad 0,0,0 sprite pozíció z irányba néző quad sprite pozíció  vertex shaderben a view trafó után adjuk hozzá a quad vertex pozíciókat

kamera koordináták camera space Sprite kinyitása projekció után model trafó modellezési koordináták model space világ- koordináták world space view trafó kamera koordináták camera space proj trafó HOMOGÉN norm. képernyő koordináták 2D quad 0,0,0 sprite pozíció z irányba néző quad sprite pozíció  homogén osztás DESCARTES norm. képernyő koordináták sprite pozíció

Sprite rajzolása Geometry Shaderrel - VS // pontprimitívek struct IaosBillboard { float3 pos : POSITION; float lifespan : LIFESPAN; float age : AGE; }; typedef IaosBillboard VsosBillboard; VsosBillboard vsBillboard(IaosBillboard input) { return input; }

Sprite rajzolása Geometry Shaderrel – GS kimenet struct GsosBillboard { float4 pos : SV_Position; float2 tex : TEXCOORD; }; float billboardWidth = 0.1; float billboardHeight = 0.1; float4 worldBillboardSize(50.0, 50.0, 0, 0); float4 screenBillboardSize = worldBillboardSize * firstPersonCam->getProjMatrix(); effect->GetVariableByName("billboardWidth") ->AsScalar() ->SetFloat(screenBillboardSize.x); effect->GetVariableByName("billboardHeight") ->AsScalar() ->SetFloat(screenBillboardSize.y);

Sprite rajzolása Geometry Shaderrel - GS [maxvertexcount(4)] void gsBillboard(point VsosBillboard input[1], inout TriangleStream stream) { float4 hndcPos= mul(float4(input[0].pos, 1), modelViewProjMatrix); GsosBillboard output; output.pos = hndcPos; output.pos.x += billboardWidth; output.pos.y += billboardHeight; output.tex = float2(1, 0); stream.Append(output); output.pos = hndcPos; output.pos.x += billboardWidth; output.pos.y -= billboardHeight; output.tex = float2(1, 1); stream.Append(output); output.pos = hndcPos; output.pos.x -= billboardWidth; output.pos.y += billboardHeight; output.tex = float2(0, 0); stream.Append(output); output.pos = hndcPos; output.pos.x -= billboardWidth; output.pos.y -= billboardHeight; output.tex = float2(0, 1); stream.Append(output); }

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

Részecskerendszer és pontprimitívek class Particle { Egg::Math::float3 position; Egg::Math::float3 velocity; float lifespan; float age; void reborn() { /*init, emitter logika*/ } void move(float dt) { position += velocity * dt; age += dt; if(age > lifespan) reborn(); } }; std::vector particles; Egg::Mesh::Shaded::P fireBillboardSet;

Input element desc D3D11_INPUT_ELEMENT_DESC particleElements[3]; particleElements[0].AlignedByteOffset = offsetof(Particle, position); particleElements[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; particleElements[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; particleElements[0].SemanticName = "POSITION"; particleElements[1].AlignedByteOffset = offsetof(Particle, lifespan); particleElements[1].Format = DXGI_FORMAT_R32_FLOAT; particleElements[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; particleElements[1].SemanticName = "LIFESPAN"; particleElements[2].AlignedByteOffset = offsetof(Particle, age); particleElements[2].Format = DXGI_FORMAT_R32_FLOAT; particleElements[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; particleElements[2].SemanticName = "AGE";

Vertex buffer (Egg::Mesh libbel) Egg::Mesh::VertexStreamDesc particleBufferDesc; particleBufferDesc.elements = particleElements; particleBufferDesc.nElements = 3; particleBufferDesc.nVertices = particles.size(); particleBufferDesc.vertexStride = sizeof(Particle); particleBufferDesc.vertexData = &particles.at(0); particleBufferDesc.cpuAccessFlags = D3D11_CPU_ACCESS_WRITE; particleBufferDesc.usage = D3D11_USAGE_DYNAMIC; Egg::Mesh::VertexStream::P particleVertexStream = Egg::Mesh::VertexStream::create(device, particleBufferDesc);

Mesh::Shaded ID3DX11EffectPass* billboardPass = effect ->GetTechniqueByName("billboard") ->GetPassByName("fire"); Egg::Mesh::Material::P fireMaterial = Egg::Mesh::Material::create(billboardPass, 0); fireBillboardSet = binder->bindMaterial(fireMaterial, particleVertexStream);

Adatok feltöltése ID3D11Buffer* vertexBuffer = fireBillboardSet ->getGeometry() ->getPrimaryBuffer(); ID3D11DeviceContext* context; device->GetImmediateContext(&context); D3D11_MAPPED_SUBRESOURCE mappedVertexData; context->Map(vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedVertexData); memcpy(mappedVertexData.pData, &particles.at(0), sizeof(Particle) * particles.size()); context->Unmap(vertexBuffer, 0); context->Release();