Graphgame gg00 4 mesh
Download
1 / 31

GraphGame gg00 4 - Mesh - PowerPoint PPT Presentation


  • 98 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'GraphGame gg00 4 - Mesh' - laszlo


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Graphgame gg00 4 mesh

GraphGamegg004-Mesh

Mesh betöltés, kirajzolás

SzécsiLászló


Mesh oszt ly
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


Mesh modul az egg libbe
Mesh modul az Egglibbe!

  • Mesh.zip letöltése

  • Egglib project folderbe kibontani

  • összes forrásfilet az Egglibhez hozzáadni


S h a red p ointer alapkoncepci
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ó


S h a red p ointer m k d se
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


S h a red p ointer vesz lye
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


S h a red p ointer haszn lata ltal ban
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;


S h a red p ointer k nyelmesen
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;

};


S h a red p ointer haszn lata ha volt lok lis typedef
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;


Akad lyozzuk meg hogy sim n newzni is lehessen
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));

}

};


S h a red p ointer haszn lata factory met dussal create
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;


Weak pointer
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);


Mi tud az egg mesh geometria
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


Mi tud az egg mesh input layout
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


Mi tud az egg mesh anyagok
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


Mi tud az egg mesh t bbf le shaderrel renderelhet mesh
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


Mi tud az egg mesh bet lt s
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


Objektumok letciklusa
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


Egg lib jraford t sa
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


Gg004 mesh project
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


Gg004 mesh project include
gg004-Mesh project include

  • additionalinclude

    • C:/Program Files/Assimp/Include;

  • linker

    • general/additional library directories

      • c:\Program Files\Assimp\lib\x86

    • input

      • assimp.lib


Game class
Game class

  • csak ezt az osztályt fogjuk átírni, hogy

    • betöltsön egy modellt

    • kirajzolja a sima idle technikával


Game h

#6.1

Game.h

#pragma once

#include "App/App.h"

#include "Mesh/Shaded.h"

#include "Mesh/Binder.h"


Game h1

#6.1

Game.h

class Game :

public Egg::App

{

ID3D11Buffer* vertexBuffer;

ID3D11InputLayout* inputLayout;

Egg::Mesh::Binder::P binder;

Egg::Mesh::Shaded::P shadedMesh;


Game cpp

#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"


Game cpp1

#6.1

Game.cpp

HRESULT Game::createResources()

{

loadEffect();

binder = Egg::Mesh::Binder::create(

device

);

// continuedonnextslide


Game cpp2

#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


Game cpp3

#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


Game cpp4

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

}


Game cpp5

#6.1

Game.cpp

HRESULT Game::releaseResources()

{

vertexBuffer->Release();

inputLayout->Release();

binder.reset();

shadedMesh.reset();

return Egg::App::releaseResources();

}



ad