310 likes | 396 Views
GraphGame gg0 1 3- Scene. Megjelenítő-motor, s z íntér-menedzsment Szécsi László. Egg / Mesh /Multi. Mesh ::Multi többanyagos, több üzemmódos háromszögháló Mesh::Flip gy űjtemény Mesh ::Flip több üzemmódos háromszögháló < Mien , Mesh::Shaded> p árok gyűjteménye Mesh :: Mien
E N D
GraphGamegg013-Scene Megjelenítő-motor, színtér-menedzsment SzécsiLászló
Egg/Mesh/Multi • Mesh::Multi • többanyagos, több üzemmódos háromszögháló • Mesh::Flip gyűjtemény • Mesh::Flip • több üzemmódos háromszögháló • <Mien, Mesh::Shaded> párok gyűjteménye • Mesh::Mien • üzemmód-azonosító: pl: basic, deferred, shadowMapüzemmódok lehetnek
Mesh::Multi építése • a következő diákon • Mesh::Indexed, Mesh::Material, Mesh::Shaded létrehozása, ez nem újdonság • A Material nem csak egy pass beállításáról szól: effect változó beállítások is lehetnek • ezek az apply meghívásakor állítódnak be • Flip és Multi létrehozása, egyelőre egy üzemmód van a Flipben, és egy Flip a Multiban
Geometria és anyag Egg::Mesh::Indexed::P indexedMesh = loadIndexedMesh("giraffe.obj"); ID3DX11EffectPass* envmappedPass = effect ->GetTechniqueByName("envmapped") ->GetPassByName("envmapped"); Egg::Mesh::Material::P envmappedGiraffeMaterial = Egg::Mesh::Material::create(envmappedPass, 0);
Anyag effect-beállításai envmappedGiraffeMaterial->set( effect ->GetVariableByName("kdTexture")) ->AsShaderResource() ->SetResource( loadSrv("giraffe.jpg") ); envmappedGiraffeMaterial->set( effect ->GetVariableByName("envTexture")) ->AsShaderResource() ->SetResource( loadSrv("cloudyNoon.dds") );
Mesh::Shaded Egg::Mesh::Shaded::P shadedMesh = binder->bindMaterial( envmappedGiraffeMaterial, indexedMesh);
Mesh::Flip Egg::Mesh::Mien basicMien; Egg::Mesh::Flip::P giraffeFlipMesh = Egg::Mesh::Flip::create(); giraffeFlipMesh->add( basicMien, shadedMesh);
Mesh::Multi Egg::Mesh::Multi::P giraffeMultiMesh = Egg::Mesh::Multi::create(); giraffeMultiMesh->add( giraffeFlipMesh);
Hol tartunk ezzel? • a giraffeMultiMesh rajzolása pont ugyanazt eredményezi, mint a shadedMesh rajzolása • de lehetne több üzemmódot és több, eltérő módon rajzolt geometriát hozzáadni • összetettebb modellre is jó lesz • AssImp: többanyagos mesh-t több meshként importál • minden meshből csinálunk egy Flip-et, a flipeket berakjuk a multiba
Egg/Scene osztályai • Directory<Valami> • map<string, Valami::P> • ManagerApp: public SasApp • erőforrás és színtérkezelés • egycsomó Directory adattag • Directory<Entity> entities; - ez a színtérreprezentációnk • Entity alaposztály, StaticEntity implementáló • Paraméter-struktúrák
Directory • map<string, boost::shared_ptr<T> > • typedef helyett privát öröklés, de az eredmény kábé ugyanaz • DxResourceDirectory • D3Ds COM objektumok tárolására • simapointerek, nem shared • van releaseAll függvény
FIGYELEM! • Senki sem tiltja, hogy ugyanaz az objektum több néven is szerepeljen • shared pointer miatt a felszabadítás is jó lesz • Nem muszáj mindenkinek szerepelni a saját típusának a tárolójában • pl. Mesh::Indexed élhet úgy is, hogy nincs neve, de egy Mesh::Multi-ban valahol hivatkozvavan • Ugyanazon a néven különböző típusok külön tárolókban lehetnek (giraffe indexed, multi)
ManagerApp • tárolók • erőforrások: olyasmiket tárolhatunk név szerint , amiket egyszer szeretnénk létrehozni aztán többször felhasználni • shaderResourceViews – fileból betöltött textúrák • indexedMeshes – fileból betöltött geometriák • materials – effectpass + beállítások • multiMeshes – kézzel…. lehetne fileból is? • színtérelemek • entitások, kamerák
Üzemmódok • MienDirectorymiens; • ez egy sima értékeket tartalmazó map, semmi shared pointer • ebben vannak az üzemmódjaink azonosítói • getMien(stringmienName) metódus • ha van már ilyen nevű, azt adja vissza • ha nincs, csinál egy újat, és letárolja • pl. getMien("basic") inicializáláskor • futásidőben nincs string
Betöltő függvények • loadSrv(string filename, string alias) • megkeresi a filetamedia könyvtárakban • megnézi, bent van-e a directoryban már • ha igen, visszadja azt • betölti a filebóla textúrát • D3DX11CreateShaderResourceViewFromFile • eltárolja a directoryban (path, alias neveken) • visszaadja • loadIndexedMesh • ugyanez csak AssImppal tölt be egy mesht
Mesh::Multi betöltése • modellfileban több submesh, anyaginfó • AssImp ebből több aiMesh-t, aiMaterial-t gyárt • ezek alapján már tudunk Mesh::Material-t, Mesh::Shaded-et gyártani • ha tudjuk, milyen shaderekkel (effectpass-szal) akarjuk rajzolni, és ott melyik textúrát, ill. anyagjellemzőt hogy kell bekötni • mindezt tudjuk minden üzemmódra • de ezt nem szeretnénk kőbe vésni!
loadMultiMesh • ha már van ilyen a tárolóban, adjuk vissza azt • ha nincs, betöltés AssImppal • hozzunk létre egy Mesh::Multi-t • minden aiMeshre • indexed létrehozása, tárolás alias[i] néven • hozzunk létre egy Mesh::Flipet • pakoljunk bele Mesh::Shaded-eket, ahány üzemmódot akarunk támogatni • adjuk hozzá a Flipet a Multihoz • adjuk vissza a Multit virtualaddDefaultShadedMeshes
addDefaultShadedMeshes • virtuális – később változtathatjuk, hogy milyen üzemmódok, azokhoz milyen shaderek legyenek • alapimplementáció: minden Flipben • 1 üzemmód: basic • textured/texturedeffectpass • kdTexture beállítása az anyag diffúz textúrája alapján
ManagerApp::cameras • kamerák gyűjteménye
ManagerApp::cameras • kamerák gyűjteménye • currentCamera • iterátor • mindig, amikor új kamerát rakunk a tárolóba, frissíteni kell az iterátort • processMessage • ‘B’ lenyomására váltsunk kamerát
ManagerApp::entities • ManagerApp::render és ManagerApp::animate végighívja az elemeit • render metódus paraméterei a RenderParameters struktúrában • fix elemek a ManagerApp::createResources-ban beállítva • változó elemek a render-ben
Entity alaposztály • van hozzá egy Mesh::Multi • ez a “render komponens”, eztudjamitkellrajzolni • render metódus • transzformációk beállítása • multimesh rajzolása • transzformációk lekérdezésére tisztán virtuális metódusok (leszármazott osztálytól függ) • lehet fixen adott [StaticEntity] • fizikaiszimulációból[PhysicsEntity]
StaticEntity • modelMatrixtagváltozó • translate, rotate-tel állítgatható • összes függvény ez alapján adja vissza a az eredményt
FELADAT • hozzunk létre egy új projectet • amiben a Game osztály az Egg::Scene::ManagerApp-ból származik • minden eseménykezelő csakhívja az ős hasonló metódusát • createResources-ben építsünk színteret entitásokból
gg013-RenderEngine project • copy-paste-rename gg011-Particles folder • vcxproj, filters átnevezés • solution/add existing project • rename project • working dir: $(SolutionDir) • Project Properties/ConfigurationProperties/Debugging/CommandArguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" • build, run
0. részfeladat • kamera létrehozása • berakni a kamera directoryba • currentCamera= cameras.begin(); • legyen több kameraés váltogassunk B-vel
1. részfeladat • zsiráf multimesh építése (lásd a diákat a diasor elején) • zsiráf példányok (entitások) létrehozása • entities-be tegyük be őket • legyen textúrázott és envmappelt zsiráf is • több anyag létrehozása • többféle multimesh létrehozása ugyanazzal a geometriával, más anyaggal • különböző entitások eltérő multimeshsel
2. részfeladat • égbolt multimesh építése • mint a zsiráf, csak más material és indexedMesh • envTexture : cloudyNoon.dds • Egg::Mesh::Indexed::P indexedQuad = Egg::Mesh::Indexed::createQuad(device);
3. részfeladat • geopodmultimeshfileból (media/geopod.x) • loadMultiMesh • több geopod entitás létrehozása
4. részfeladat • geopod entitás építése kódból • 2 db submesh van, 2 db Flip-et kell hozzáadni • az első simán a fileból szedett multiMesh0-s submesh-e • a másodikat rakjuk össze nulláról, mint a zsiráfét • a másodikban envmappedmateriallal • a kdTexture legyen white.png, nem a zsiráfpacák