Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

1 Mesh betöltés, kirajzolás Szécsi László

2 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

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

4 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ó

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

6 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

7 { 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;

8 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; };

9 { 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;

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

11 { 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;

12 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);

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 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

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

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

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

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

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

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

27 // 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

28 // 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

29 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

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

31


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések