Grafikus játékok fejlesztése Szécsi László g10-engine

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

2010/2011 ősz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál  Részei.
C++ programozási nyelv Gyakorlat hét
EE/R adatmodell (Extended E/R) 1 Az objektum orientált szemlélet elterjedésével egyre nőtt az igény az olyan SDM (Semantic Data Model) modellek iránt,
Programozás III KOLLEKCIÓK 2..
Lua script Szécsi László
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Objective- C Bereczki Gréta Tamara
Adatbányászati technikák (VISZM185)
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.
Öröklődés 2..
JavaScript.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Szabó Tamás Károly G6HT12 A Ruby programozási nyelv.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Bevezetés a Java programozásba
Fájlkezelés, IO Kivételkezelés Belső osztályok
Vizuális modellezés Uml és osztálydiagram UML eszközök
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények,
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Az objektum-orientált tervezési alapelvek kritikai vizsgálata
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/14 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/10 C++ programozási nyelv Gyakorlat - 5. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
C# tagfüggvények.
C# tagfüggvények.
Entity framework Krizsán Zoltán
Web-grafika (VRML) 10. gyakorlat Kereszty Gábor. Script típusok Elemi típusok: szám: egész vagy lebegőpontos – int / float – 1 / 1.1 string: ‘Hello World!’
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
P ROGRAMOZÁS C# - BAN Kivételkezelés. P ÉLDA I. Nullával való osztás miatt kapjuk a hibaüzenetet.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
A PHP 5 újdonságai Az OOP terén. Miről lesz szó? Osztályok kezelése – Új direktívák – Konstruktor – Destruktor Interfészek Kivételkezelés.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
Hernyák Zoltán Programozási Nyelvek II.
A D programozási nyelv Angeli Dávid. Nagy vonalakban  C++  
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
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.
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:
Transzformációk, textúrák, árnyalás Szécsi László.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
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.
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
Apache Ant 2. gyakorlat Alkalmazásfejlesztés /2 Gyakorlat Zalatnai Csongor.
Ficsor Lajos CPP2 / 1 Származtatási mechanizmus a C++ nyelvben Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék.
Haladó C++ Programozás Programtervezési minták – alapok Sonkoly Balázs
Intelligens Mérnöki Rendszerek Laboratórium Alkalmazott Matematikai Intézet, Neumann János Informatikai Kar, Óbudai Egyetem Mielőtt a virtuális térbe lépnénk.
Haladó C++ Programozás SzJ/IV
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
Opencms modul fejlesztés Krizsán Zoltán. Modulok fajtái Nincs előírás, csak tipikus tennivalók: –Content type: új típus(oka)t vezet be. –Template: új.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
„Designer-barát” játéklogika
Neumann János Informatikai Kar
Hernyák Zoltán Programozási Nyelvek II.
Sw2 PhysX.
JavaScript a böngészőben
JavaScript a böngészőben
Előadás másolata:

Grafikus játékok fejlesztése Szécsi László 2011.03.16. g10-engine Játékmotor Grafikus játékok fejlesztése Szécsi László 2011.03.16. g10-engine

OO adatok és műveletek A virtuális világ tárolása Funkciók control: vezérlés player input AI fizika animate: mozgatás render: megjelenítés onFrameMove

A virtuális világ alapelem: Entity [GameObject, Renderable] Egg Entity control() animate() render() Entity control() animate() render()

Entity adatszerkezet nem tudjuk előre hány és milyen entitás lesz dinamikus (fa, lista, hashmap) bővíthető heterogén ha később lesz SpaceShip:Entity és Meteor:Entity akkor mindegyik példányait be lehessen rakni kereshető ütközéshez: közelség alapján adminisztrációhoz: név alapján több párhuzamos adatszerkezet is jól jöhet [SceneManager]

Asszociatív tömb név alapján (String) címezhető tömb STL [Standard Template Library] typedef std::map<const std::string, Entity*> EntityDirectory; EntityDirectory entityDirectory;

Mire jó a név? A pályát majd fileból/scriptből töltjük be Ha mindennek van neve, lehet rá a fileban hivatkozni Pl. a kamera legyen a “GIJoe” nevű entitáshoz kötve (FPS) Mindennek lesz neve pl. a playerShip entitás a steelHullShip modellt használja, ami a spaceShip mesh feltextúrázva

Template és shared pointer template<class _Ty> class Directory : private std::map<std::string, boost::shared_ptr<_Ty> > { … }; Directory<Entity> entityDirectory;

Shared pointer referenciaszámlált egyébként pointerként használható nem kell explicit delete nem kell figyelni rá, hogy a sok hivatkozó objektumból csak egy szabadítsa fel, és az is csak a végén egyébként pointerként használható Valami* helyett boost::shared_ptr<Valami> a típus neve lokális typedef a valami osztályban Valami::P

Színtér gráf [Scene graph] Listában nehéz: ne rajzoljuk a karaktert és az összes ráaggatott tárgyat (pl. láthatatlan) mozgassuk együtt az autót és a kerekeit mindenki ütközzön mindenkivel, akivel van értelme Legyen fa csomópont:NodeGroup entitásokat és újabb csomópontokat tartalmazhat legyen a közös interface Node

Adatszerkezet Node Scene NodeGroup Entity EntityDirectory control() animate() render() subNodes Scene control() animate() render() NodeGroup sceneRoot entities Entity EntityDirectory

Scene::render szekvencia sceneRoot NodeGroup render() render render render NodeGroup render() Entity render() render render render Entity render() Entity render() Entity render()

Színtérgráf bejárása Minden objektumra meghívni Nem csak a render de egy részgráfra letiltható NodeGroup-ba visible flag Nem csak a render animate ugyanígy control hasonló, de más entitások is hatnak egy entitásra sceneRoot a control paramétere lesz Entity::control is bejárja a színtérgráfot: interact

Erőforrások háromszögháló geom. modellek [mesh] shader technique-ák egy effect fileban lehet ua. a mesh más shaderrel lehet több mesh ua. shaderrel textúrák a modellekhez shaderekbe kell bekötni őket fizikai modellek (pl. kocka) lehet ua. a geometria különböző fizikával ua. fizikát használhatják más geo. entitások

Példa: autóverseny játékos autója entitás ellenfél autója entitás ‘buggy’ mesh, ‘phong’ technique, ’blue’ textúra, ‘accurateBuggy’ fizika ellenfél autója entitás ‘buggy’ mesh, ‘phong’ technique, ’red’ textúra, ‘accurateBuggy’ fizika álló akadály (szikla) ‘boulder’ mesh, ‘lambert’ technique, ’rock’ textúra, ‘static’ fizika akadály (lerobbant versenyző) ‘buggy’ mesh, ‘lambert’ technique, ’burnout’ textúra, ‘static’ fizika

Rendering engine konténerek TextureDirectory D3DTexture Scene control() animate() render() MeshDirectory D3DXMesh ShadedMeshDirectory ShadedMesh EntityDirectory Entity

Technique Nem kell külön definiálnunk az effect fileban már definiálva van Nem kell nyilvántartanunk a létező technikákat a D3DXEffect osztály nyilvántartja őket név alapján lehet rájuk hivatkozni ShadedMesh-be: Material technique neve + hivatkozások a textúrákra minden submeshre (lehet más a shader)

Entity::Render szekvencia drawSubset Entity ModelMatrix render(camera, effect) ShadedMesh render(effect) D3DXMesh drawSubset() apply subsetMaterials setMatrix Material apply(effect) D3DTexture D3DXEffect setMatrix() setTexture() setTechnique() setTexture setTechnique

Renderelési szerepek Nem mindig ugyanúgy kell rajzolni egy entitást pl. árnyék-térkép: csak a mélység kell Klasszikus megoldás lecserélni az összes Material-t Modern engineben gyakran kell váltani render target, multi-pass módszerek építsük be

Szerep beillesztése Entity ShadedMesh D3DXMesh Role Material ModelMatrix render( camera, effect, rolename) ShadedMesh render(effect, rolename) D3DXMesh drawSubset() roles Role render(mesh, effect) subsetMaterials Material apply(effect) D3DTexture

Alap ShadedMesh .x file Minden meshhez gyártsunk egy alap ShadedMesh-t material információ textúra nevek <effect info> lehetne benne de nem jellemző Minden meshhez gyártsunk egy alap ShadedMesh-t Shader legyen egy “basic” technique az .fx fileban

Színtér felépítés kódból void Scene::createLevel(){ sceneRoot = new NodeGroup(); LPD3DXMESH mesh; int nSubMeshes; LPD3DXBUFFER materialBuffer; D3DXLoadMeshFromX( … &mesh … ); meshDirectory[L”f1car”] = mesh; ShadedMesh* ferrariPaintF1car = new ShadedMesh(mesh, nSubmeshes, materialBuffer, textureDirectory); shadedMeshDirectory[L”ferrari”] = ferrariPaintF1car; D3DXMATRIX polePosition; Entity* raikonnenCar = new Entity(ferrariPaintF1car, polePosition); entityDirectory[L”RaikonnenCar”] = raikonnenCar; sceneRoot->add(raikonnenCar); }

alap ShadedMesh konstruktor ShadedMesh::ShadedMesh( LPD3DXMESH mesh, LPD3DXBUFFER materialBuffer, unsigned int nSubMeshes, TextureDirectory& textureDirectory, LPDIRECT3DDEVICE9 device) { this->mesh = mesh; roles.push_back( new Role( L”basic”, materialBuffer, nSubMeshes, textureDirectory, device) ); }

alap Role konstruktor Role::Role(LPD3DXBUFFER materialBuffer, unsigned int nSubMeshes, TextureDirectory& textureDirectory, LPDIRECT3DDEVICE9 device) { D3DXMATERIAL* matArray = (D3DXMATERIAL*)materialBuffer->GetBufferPointer(); for(int t=0; t<nSubMeshes; t++) { LPDIRECT3DTEXTURE9 texture; TextureDirectory::iterator iTex = textureDirectory.find(matArray[t].pTextureFilename); if(iTex == textureDirectory.end()) { // ... textúra betöltés textureDirectory[matArray[t].pTextureFilename] = texture; } else texture = iTex->second; Material* material = new Material(“basic"); material->setTexture("kdMap", texture); submeshMaterials.push_back(material);

alap Role konstruktor Role::Role(LPD3DXBUFFER materialBuffer, unsigned int nSubMeshes, TextureDirectory& textureDirectory, LPDIRECT3DDEVICE9 device) { D3DXMATERIAL* matArray = (D3DXMATERIAL*)materialBuffer->GetBufferPointer(); for(int t=0; t<nSubMeshes; t++) { LPDIRECT3DTEXTURE9 texture; TextureDirectory::iterator iTex = textureDirectory.find(matArray[t].pTextureFilename); if(iTex == textureDirectory.end()) { // ... textúra betöltés textureDirectory[matArray[t].pTextureFilename] = texture; } else texture = iTex->second; Material* material = new Material(“basic"); material->setTexture("kdMap", texture); submeshMaterials.push_back(material);

alap Role konstruktor Role::Role(LPD3DXBUFFER materialBuffer, unsigned int nSubMeshes, TextureDirectory& textureDirectory, LPDIRECT3DDEVICE9 device) { D3DXMATERIAL* matArray = (D3DXMATERIAL*)materialBuffer->GetBufferPointer(); for(int t=0; t<nSubMeshes; t++) { LPDIRECT3DTEXTURE9 texture; TextureDirectory::iterator iTex = textureDirectory.find(matArray[t].pTextureFilename); if(iTex == textureDirectory.end()) { // ... textúra betöltés textureDirectory[matArray[t].pTextureFilename] = texture; } else texture = iTex->second; Material* material = new Material(“basic"); material->setTexture("kdMap", texture); submeshMaterials.push_back(material); másfajta uniform paraméterekre is ugyanez a mechanizmus

Material::setTexture() class Material { TextureDirectory textureEffectVariables; // ... másfajta változóknak is Directory void setTexture( const std::string& textureName, LPDIRECT3DTEXTURE9 texture) textureEffectVariables[textureName] = texture; }

Entity konstruktor Entity::Entity( ShadedMesh* shadedMesh, const D3DXMatrix& modelMatrix) { this->shadedMesh = shadedMesh; this->modelMatrix = modelMatrix; }

Render szekvencia kódban Entity::render effect->SetMatrix("modelMatrix", &modelMatrix); effect->SetMatrix("modelMatrixInverse", &modelMatrixInverse); effect->SetMatrix("modelViewProjMatrix", &(modelMatrix * *camera.GetViewMatrix() * *camera.GetProjMatrix())); ShadedMesh::render Role::render unsigned int nSubmeshes = materials.size(); for(unsigned int i=0; i<nSubmeshes; i++) { materials[i]->apply(effect); unsigned int nPasses = 0; effect->Begin(&nPasses, 0); for(unsigned int p=0; p<nPasses; p++) { effect->BeginPass(p); mesh->DrawSubset(i); effect->EndPass(); } effect->End(); effect->SetTechnique(techniqueName); TextureDirectory::iterator i = textureEffectVariables.begin(); while(i != textureEffectVariables.end()){ effect->SetTexture(i->first, i->second); i++; }

Rendering engine kész. Mire vágyhatunk még? kamera fények fix / entitáshoz kötött vezérlés játékos melyik entitást vezérli gép melyik entitásokat vezérli fizikai / ütközés modell itt lesz hasznos az entitás néve

Kamera entitáshoz kötött régi globál kamera bővíthető a kamera trafót az entitástól kérjük el minden rajzolás előtt ha nincs owner, akkor világban rögzített régi globál kamera bővíthető helikopteres fix, de objektumra néző

Fények új SpotLight osztály új Directory<SpotLight> fény tulaj vagy pozíció és orientáció később majd árnyéktérkép-számítás új Directory<SpotLight> rajzolás előtt a fények effect változóit be kell állítani

Vezérlés Entity osztálynak leszármazottai XML render, animate és control metódusok felüldefiniálása render: pl. model trafó fizika alapján animate: pl. fizikai animáció control: fizikai hatások / AI / user input XML vagy új tag-et vezetünk be (pl. RigidBody) vagy attribútumokat a <Entity>-be <Entity … control=“player” ...>

Játékmotor objektummodellek Grafikus játékok fejlesztése Szécsi László

Runtime object model milyen adatszerkezet, C++ osztály-példányok? játékban létező dolgok = entitások ezek tulajdonságai = attributes, properties ezek viselkedése = behavior

Object model alaptípusok I Objektum-centrikus entitás osztály példányai attribútumok tagváltozók viselkedést a metódusok szabják meg új attribútum vagy viselkedés leszármaztatás delegálás

Object model alaptípusok II Tulajdonság-centrikus az entitást csak egy azonosító jelenti minden elképzelhető tulajdonsághoz van egy táblázat azonosító alapján előkereshető, hogy pl mennyi az életereje milyen háromszögháló modell tartozik hozzá viselkedést az szabja meg, milyen tulajdonságok vannak - hardcoded ha van Health property, sérülhet és megsemmisülhet

Objektum-centrikus: hajóverseny milyen entitások lehetnek játékos-vezérelte hajó ellenséges (AI vezérelte) hajó parton heverésző pingvin vízfelület rámpák vízesés fröccsenő víz, füst (részecskerendszerek) terep, fák, statikus geometria

Biztos, hogy más dolgok nem entitások? fények? kamerák? a zóna amibe ha belépünk kinyílik az ajtó? az update/render értelemben nem, de lehet olyan architektúra, ahol minden ilyesmi egységesen van kezelve, és a klasszikus renderelhető entitás csak egy altípus pl. Shark3D

Hajóverseny ezeknek mind kell render update (control + animate) Entity ősosztály, virtuális függvények implementálva hasonlót ne kelljen többször hierarchia

Példa: PacMan

Bonyolultabb példa: UT2004

Monolitikus osztályhierarchia egyetlen ősosztály minden sajátosság, eltérés kétféle entitás között egy őröklődés

Monolitikus problémák SOK osztály, nehezen követhető ránézünk egy osztályra, és csak akkor értjük, ha végignézzük a teljes láncban az összes szülőjét

Taxonómia Kingdom: Animalia Phylum: Chordata Subphylum: Vertebrata Class: Reptilia Order: Squamata Suborder: Serpentes Family: Viperidae Subfamily: Viperinae Genus: Vipera

Többdimenziós taxonómia Kingdom: Animalia Phylum: Chordata Class: Mammalia Infraclass: Marsupialia Order: Diprotodontia Family: Phascolarctidae Genus: Phascolarctos Species: P. cinereus látható dolgok aranyos dolgok nem tarka állatok szürke állatok

Többdimenziós taxonómia játékban átlátszó/szilárd árnyékot vet/nem vet mászik/úszik/repül sebezhető/sebezhetetlen üt/vág/lézert lő/lövedéket lő milyen lövedéket? célkövető/stb.

Hogy oldanánk ezt meg monolitikusan?

Mi van, ha kell kétéltű jármű?

Többszörös öröklés: mix-in ennek nincs szülője

A felszálló buborék vízen lebegő ládák tök jó, lebeghessen más is: karakterek, járművek de hát ilyen nem volt a fában ezért a kód kerüljön a gyökérbe max néhány leszármazott nem haszálja: canFloat = false

A megoldás: öröklés helyett kompozíció (aggregáció)! is-a helyett has-a a hajó nem egy lebegő valami, hanem rendelkezik a lebegés képességével ha kell nem-lebegő hajó, kivehetjük akár futásidőben is ha valami más kell lebegjen, akkor ő is megkapja a képességet

Aggregáció: fix elemek

Aggregáció: tetszőleges elemek