1 / 31

GraphGame gg00 4 - Mesh

GraphGame gg00 4 - Mesh. Mesh bet öltés, kirajzolás Szécsi László. Mesh osztály. 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

laszlo
Download Presentation

GraphGame gg00 4 - Mesh

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. GraphGamegg004-Mesh Mesh betöltés, kirajzolás SzécsiLászló

  2. Mesh osztály • 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 • vertexbuffer, index buffer, vertexelements • fileból: AssImp lib segítségével

  3. Mesh modul az Egglibbe! • Mesh.zip letöltése • Egglib project folderbe kibontani • összes forrásfilet az Egglibhez hozzáadni

  4. Shared pointer alapkoncepció • 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. Shared pointer működése shared_ptr Wrapper refCount: 1 refCount: 2 if 0 copy constructor mezei pointer shared_ptr new delete destructor Dinamikusan allokált objektum

  6. Shared pointerveszélye • 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őlgetmetódussal kiszedjük a pointert

  7. Shared pointerhasználata általában { shared_ptr<Valami> pNull(); // Valami* pNull= NULL; shared_ptr<Valami> p( new Valami(1) ); // Valami* p = new Valami(1); p->mezo = 3; // ugyanaz p->metodus(1, 2, 3); // operátoroverload }// delete p;

  8. Shared pointer kényelmesen • Valami* helyett boost::shared_ptr<Valami> 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ó headerfileokban, include kell class Valami { public: typedef boost::shared_ptr<Valami> P; };

  9. Shared pointerhasználata ha volt lokális typedef { Valami::Pp( new Valami(1) ) ; // Valami* p = new Valami(1); p->mezo = 3; // ugyanaz p->metodus(1, 2, 3); // operátoroverload }// delete p;

  10. Akadályozzuk meg, hogy simán newzni is lehessen class Valami { private: Valami(intconstrParam); public: typedef boost::shared_ptr<Valami> P; static P create(intconstrParam) { return P(new Valami(constrParam)); } };

  11. Shared pointerhasználata factory metódussal[create] { Valami::Pp = Valami::create(1); // Valami* p = new Valami(1); p->mezo = 3; // ugyanaz p->metodus(1, 2, 3); // operátoroverload }// delete p;

  12. Weak pointer • boost::weak_ptr<Valami> • nemakadá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. Mi tud az Egg/Mesh? – geometria • Mesh::Geometry – rajzolható geometriát reprezentál • Mesh::VertexStream – vertexbuffer + input elementdesc • Mesh::Indexed – vertexbufferek, index buffer, primitvetype, input elementdesc– ezttudjaegy 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. Mi tud az Egg/Mesh? – input layout • Mesh::Binder • ID3D11InputLayout referenciákat tárol • meg a hozzájuk tartozó input elementdesc/shaderinputsignaturekombókat • getCompatibleInputLayout metódus: egy ilyen kombóra kiadja a meglevőt, vagy gyárt újat • Mesh::Bound • Mesh::Geometry + ID3D11InputLayout

  15. Mi tud az Egg/Mesh? – anyagok • 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. Mi tud az Egg/Mesh? – többféle shaderrelrenderelhetőmesh • Mesh::Mien • üzemmód (képernyőre/deferredshadingbufferbe/á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. Mi tud az Egg/Mesh? – betöltés • Mesh::Importer • AssImp könyvtár • mindent betölt • aiMesh-t kapunk • Mesh::Importer::fromAiMesh • aiMesh-bőlMesh::Indexed • erre aztánlehet Bound, Shaded, Flip mesheketépíteni

  18. Objektumok életciklusa • 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álistypedef: • Mesh::Indexed::P – indexed meshremutató sharedptr • Mesh::Indexed::W – indexed meshremutató weakptr • konstruktor helyett factorymethod: create

  19. Egglib újrafordítása • additionalinclude: • 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. gg004-Mesh project • copy-paste-rename gg003-Egg 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

  21. gg004-Mesh project include • additionalinclude • C:/Program Files/Assimp/Include; • linker • general/additional library directories • c:\Program Files\Assimp\lib\x86 • input • assimp.lib

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

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

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

  25. #6.1 Game.cpp #include "DXUT.h" #include "Game.h" #include <assimp/importer.hpp> #include <assimp/scene.h> #include <assimp/postProcess.h> #include "Mesh/Importer.h" #include "UtfConverter.h"

  26. #6.1 Game.cpp HRESULT Game::createResources() { loadEffect(); binder = Egg::Mesh::Binder::create( device ); // continuedonnextslide

  27. #6.1 Game.cpp // continuedfrompreviousslide 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; }// continuedonnextslide

  28. #6.1 Game.cpp // continuedfrompreviousslide 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; }// createResourcesends

  29. #6.1 Game.cpp 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); }

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

  31. Eredmény

More Related