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.

Slides:



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

Számítógépes grafika DirectX 2. gyakorlat. Emlékeztető  Előző órán szó volt a COM modellről, amiben az objektumok eljárásait az általuk megvalósított.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
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.
GraphGame gg001-Triangle
C++ programozási nyelv Gyakorlat hét
Lua script Szécsi László
Objektum Orientált Programozás Visual Basicben. 2 Objektumok Object – egy dolog, tárgy, „valami” –Command button, text box, stb. Jellemzők –Properties.
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
Objective-C Memória kezelés
Szécsi László. June 2010 DirectX SDK Visual Studio 2010.
GPGPU labor I. OpenGL, Cg.
Öröklődés 2..
© 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.
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.
10. előadás (2004. április 20.) A C előfordító (folytatás) Néhány hasznos compiler opció Egy tanulságos könyvtári függvény Változó hosszúságú argumentum.
6. előadás (2005. április 5.) Struktúrák Úniók Új adattípus definíálása Dinamikus memória foglalás 1.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
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.
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.
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Számítógépes grafika OpenGL 1. gyakorlat.
2008/2009 tavasz Klár Gergely  A DirectX egy alacsonyszintű API gyűjtemény  Multimédiás alkalmazások futtatására, írására szolgál 
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.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
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ú,
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ó.
DirectX9 empty project Szécsi László. Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\
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.
Plakátok, részecskerendszerek Grafikus játékok fejlesztése Szécsi László g09-billboard.
Grafikus játékok fejlesztése Szécsi László g10-engine
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
OO framework, Egg util library László Szécsi. Projektek nem osztoznak semmilyen kódon – DXUT mindegyikben – effect betöltés, mesh betöltés, GUI mindegyikbe.
Geometry instancing Szécsi László. copy-paste-rename gg009-Gui folder vcxproj, filters átnevezés solution/add existing project rename project working.
User interface Szécsi László. Egg projectben DXUTgui.cpp – CDXUTDialogResourceManager::CDXUTDialogReso urceManager() m_SpriteBufferBytes11 = 0; ezt kihagyták,
Textúrázás Szécsi László. giraffe.jpg letöltése SolutionDir/Media folderbe.
Számítógépes grafika DirectX 2. gyakorlat. Emlékeztető Előző órán áttekintettük a szükséges WinAPI- s alapokat Illetve röviden beletekintettünk a félév.
ARM tanfolyam 2. előadás.
Java programozási nyelv Metódusok
2. gyakorlat DirectX 2007/2008 tavasz Klár Gergely
ELTE-IK, Számítógépes grafika 2./haladó 2. gyakorlat Klár Gergely.
2. Gyakorlat Zalatnai Csongor
Vizualizáció és képszintézis Sugárkövetés (Dart + GLSL) Szécsi László.
Számítógépes grafika OpenGL 5. gyakorlat.
5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.
Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos.
Számítógépes grafika DirectX 6. gyakorlat. Emlékeztető Múlt órán megvilágítással foglalkoztunk  Per vertex  Per pixel.
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.
gg004-Mesh project copy-paste-rename gg002-App folder
Kamera, 3D, transzformációk Szécsi László
OpenGL II.
Sw2 PhysX.
JavaScript a böngészőben
Direct3D DirectCompute
OO framework, Egg util library László Szécsi
GraphGame gg001-Triangle
Environment mapping Szécsi László
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Az objektum-orientáltság
Függvénysablonok használata
Előadás másolata:

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 betölteni – túl bonyolult most nekünk Saját Mesh osztály – vertex buffer, index buffer, vertex elements – fileból: AssImp lib segítségével

Mesh.zip letöltése Egg lib project folderbe kibontani összes forrásfilet az Egg libhez hozzáadni

referenciaszámlált – 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ó

Dinamikusan allokált objektum Wrapper refCount: 1 mezei pointer shared_ptr new shared_ptr copy constructor refCount: 2 destructor delete if 0

SOHA ne legyen ugyanarra az objektumra shared és normál pointerünk is – ha lehet, akkor minden típusra előre döntsük el, hogy a példányaira csak sima vagy csak shared pointerek lesznek – ha lehet, kerüljük el, hogy a shared_ptr-ből get metódussal kiszedjük a pointert

{ shared_ptr pNull(); // Valami* pNull = NULL; shared_ptr p( new Valami(1) ); // Valami* p = new Valami(1); p->mezo = 3;// ugyanaz p->metodus(1, 2, 3);// operátor overload } // delete p;

Valami* helyett boost::shared_ptr a típus neve – lokális typedef a Valami osztályban – Valami::P a pointer típus – hátulütő: class Valami; elődeklaráció nem elég a pointer használó header fileokban, include kell class Valami { public: typedef boost::shared_ptr P; };

{ Valami::P p( new Valami(1) ) ; // Valami* p = new Valami(1); p->mezo = 3;// ugyanaz p->metodus(1, 2, 3);// operátor overload } // delete p;

class Valami { private: Valami(int constrParam); public: typedef boost::shared_ptr P; static P create(int constrParam) { return P(new Valami(constrParam)); } };

{ Valami::P p = Valami::create(1); // Valami* p = new Valami(1); p->mezo = 3;// ugyanaz p->metodus(1, 2, 3);// operátor overload } // delete p;

boost::weak_ptr nem akadályozza meg a felszabadítást lock metódus – ha még létezik: ad egy érvényes shared pointert (számláló nő) – ha már nem létezik: ad egy NULL shared pointert Entity::P lockedOwner = owner.lock(); if(!lockedOwner) D3DXMatrixIdentity(&entityModelMatrix); else lockedOwner->getModelMatrix(entityModelMatrix);

Mesh::Geometry – rajzolható geometriát reprezentál – Mesh::VertexStream – vertex buffer + input element desc – Mesh::Indexed – vertex bufferek, index buffer, primitve type, input element desc – ezt tudja egy Mesh osztály általában (-submesh) – Mesh::Instanced – vertex, index, instance bufferek, példányok száma – Mesh::Nothing – n darab üres vertexrekordból álló VB ha a VS pl. textúrából vesz minden adatot és nem kell neki input

Mesh::Binder – ID3D11InputLayout referenciákat tárol – meg a hozzájuk tartozó input element desc/shader input signature kombókat – getCompatibleInputLayout metódus: egy ilyen kombóra kiadja a meglevőt, vagy gyárt újat Mesh::Bound – Mesh::Geometry + ID3D11InputLayout

Mesh::Material – technique/pass & shader-paraméterek – ID3DX11EffectPass & ID3DX11EffectVariable+érték párok – effect változók beállítására ott az Effects11 – utána Material::saveVariable – ha valamit ezzel az anyaggal akarunk rajzolni, akkor előtte Material::apply Mesh::Shaded – Mesh::Bound + Mesh::Material

Mesh::Mien – üzemmód (képernyőre/deferred shading bufferbe/árnyéktérképbe/ etc.) – ugyanazt az objektumot a különböző menetekben más shaderekkel kell renderelni Mesh::Flip – Mien+Shaded párok – minden üzemmódhoz egy Mesh::Shaded

Mesh::Importer – AssImp könyvtár mindent betölt aiMesh-t kapunk – Mesh::Importer::fromAiMesh aiMesh-ből Mesh::Indexed erre aztán lehet Bound, Shaded, Flip mesheket építeni

egy geometriát sok mesh használhat, egy materialt is, stb. referenciaszámlálás – nem kell aggódnunk a felszabadítás miatt – boost::shared_ptr – lokális typedef: Mesh::Indexed::P – indexed meshre mutató shared ptr Mesh::Indexed::W – indexed meshre mutató weak ptr – konstruktor helyett factory method: create

additional include: – C:/Program Files/Assimp/Include –. – azért hogy pl. az #include "Mesh/Material.h" működjön már ezt is tudja az Egg! gyártsunk egy új projectet ami ezt használja is

copy-paste-rename gg003-Egg folder vcxproj, filters átnevezés solution/add existing project rename project working dir: $(SolutionDir) Project Properties/Configuration Properties/Debugging/Command Arguments --solutionPath:"$(SolutionDir)" --projectPath:"$(ProjectDir)" build, run

additional include – C:/Program Files/Assimp/Include; linker – general/additional library directories c:\Program Files\Assimp\lib\x86 – input assimp.lib

csak ezt az osztályt fogjuk átírni, hogy – betöltsön egy modellt – kirajzolja a sima idle technikával

#pragma once #include "App/App.h" #include "Mesh/Shaded.h" #include "Mesh/Binder.h" #6.1

class Game : public Egg::App { ID3D11Buffer* vertexBuffer; ID3D11InputLayout* inputLayout; Egg::Mesh::Binder::P binder; Egg::Mesh::Shaded::P shadedMesh; #6.1

#include "DXUT.h" #include "Game.h" #include #include "Mesh/Importer.h" #include "UtfConverter.h" #6.1

HRESULT Game::createResources() { loadEffect(); binder = Egg::Mesh::Binder::create( device ); // continued on next slide #6.1

// continued from previous slide Assimp::Importer importer; const aiScene* assScene = importer.ReadFile( App::getSystemEnvironment(). resolveMediaPath("giraffe.obj"), 0); // if the import failed if( !assScene || !assScene->HasMeshes() || assScene->mNumMeshes == 0) { shadedMesh.reset(); return E_FAIL; } // continued on next slide #6.1

// continued from previous slide Egg::Mesh::Indexed::P indexedMesh = Egg::Mesh::Importer::fromAiMesh( device, assScene->mMeshes[0]); ID3DX11EffectPass* idlePass = effect-> GetTechniqueByName("idle")-> GetPassByName("idle"); Egg::Mesh::Material::P idleMaterial = Egg::Mesh::Material::create(idlePass, 0); shadedMesh = binder-> bindMaterial(idleMaterial, indexedMesh); return S_OK; } // createResources ends #6.1

void Game::render(ID3D11DeviceContext* context) { float clearColor[4] = { 0.9f, 0.7f, 0.1f, 0.0f }; ID3D11RenderTargetView* defaultRtv = DXUTGetD3D11RenderTargetView(); ID3D11DepthStencilView* defaultDsv = DXUTGetD3D11DepthStencilView(); context->ClearRenderTargetView( defaultRtv, clearColor ); context->ClearDepthStencilView( defaultDsv, D3D11_CLEAR_DEPTH, 1.0, 0 ); unsigned int stride = sizeof(D3DXVECTOR3); unsigned int offset = 0; context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); context->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetInputLayout(inputLayout); effect->GetTechniqueByName("idle") ->GetPassByName("idle") ->Apply(0, context); context->Draw(3, 0); shadedMesh->draw(context); } #6.1

HRESULT Game::releaseResources() { vertexBuffer->Release(); inputLayout->Release(); binder.reset(); shadedMesh.reset(); return Egg::App::releaseResources(); } #6.1