Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaÁron Pintér Megváltozta több, mint 10 éve
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.