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

Transzformációk, textúrák, árnyalás Szécsi László.

Hasonló előadás


Az előadások a következő témára: "Transzformációk, textúrák, árnyalás Szécsi László."— Előadás másolata:

1 Transzformációk, textúrák, árnyalás Szécsi László

2 Modell www.iit.bme.hu/~szecsi/GraphGame /buggy.zip kibontani: GraphGame\media folderbe a buggy.x itt legyen: GraphGame\media\buggy\buggy.x

3 Új osztály Lab2Transform base class: EngineInterface

4 GraphGame.cpp Lab1 példány helyett Lab2 példányt hozzunk létre #include “Lab2Transform.h”

5 Vertex buffer helyett mesh class Lab2Transform : public EngineInterface { LPD3DXEFFECT effect; LPD3DXMESH mesh; int nSubMeshes; …

6 Lab2Transform.h metódusok public:Lab2Transform( LPDIRECT3DDEVICE9 device); HRESULT createDefaultResources(); HRESULT releaseDefaultResources(); HRESULT createManagedResources(); HRESULT releaseManagedResources(); void processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void animate(double dt, double t); void render(); };

7 Effect betöltése hibakezeléssel HRESULT Lab2Transform::createDefaultResources(){ LPD3DXBUFFER compilationErrors; if(FAILED( D3DXCreateEffectFromFile(device, L"trafo.fx", NULL, NULL, 0, NULL, &effect, &compilationErrors))){ if(compilationErrors) MessageBoxA( NULL, (LPSTR)compilationErrors->GetBufferPointer(), "Failed to load effect file!", MB_OK); exit(-1); } return S_OK; }

8 Mesh betöltése HRESULT Lab2Transform::createManagedResources () { D3DXLoadMeshFromX( L"media\\buggy\\buggy.x", D3DXMESH_MANAGED, device, NULL, NULL, NULL, (DWORD*)&nSubMeshes, &mesh);

9 Mesh felszabadítása HRESULT Lab2Transform::releaseManagedResources () { mesh->Release(); return S_OK; }

10 mesh rajzolása effect->BeginPass(0); for(int i=0; i<nSubMeshes; i++) { mesh->DrawSubset(i); } effect->EndPass();

11 kamera class Lab2Transform : public LabInterface {... CFirstPersonCamera camera;...

12 kamera init Lab2Transform::Lab2Transform( LPDIRECT3DDEVICE9 device){ camera.SetViewParams( &D3DXVECTOR3(10, 10, 10), &D3DXVECTOR3(0, 0, 0)); camera.SetProjParams(3.14f / 2.0f, 1.0, 0.1, 1000.0); } eye lookat FOV aspectbackfront

13 kamera vezérlés & animáció void Lab2Transform::processMessage( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ camera.HandleMessages( hWnd, uMsg, wParam, lParam); } void Lab2Transform::animate(double dt, double t) { camera.FrameMove(dt); }

14 új fx file solution explorer add new item txt file trafo.fx

15 trafo.fx uniform paraméterek float4x4 modelViewProjMatrix; float4x4 modelMatrix; float4x4 modelMatrixInverse;

16 trafo.fx input output szemantika struct TrafoInput{ float4 pos: POSITION; float3 normal: NORMAL; float2 tex: TEXCOORD0; }; struct TrafoOutput{ float4 pos: POSITION; float3 normal: TEXCOORD2; float2 tex: TEXCOORD0; float4 worldPos: TEXCOORD1; };

17 Vertex shader TrafoOutput vsTrafo(TrafoInput input){ TrafoOutput output = (TrafoOutput)0; output.pos = mul(input.pos, modelViewProjMatrix); output.worldPos = mul(input.pos, modelMatrix); output.normal = mul(modelMatrixInverse, float4(input.normal.xyz, 0.0)); output.tex = input.tex; return output; } modell -> n.képernyő modell -> világ

18 pixel shader float4 psDiffuse(TrafoOutput input) : COLOR0 { return input.normal.y; }

19 technique technique show { pass ExamplePass { VertexShader = compile vs_2_0 vsTrafo(); PixelShader = compile ps_2_0 psDiffuse(); }

20 Lab2Transform cseréljük le az effect file és a technika nevét render metódusban, BeginScene előtt: rakjuk össze a trafómátrixokat D3DXMATRIX modelMatrix; D3DXMATRIX modelMatrixInverse; D3DXMATRIX modelViewProjMatrix;

21 mátrixok D3DXMatrixIdentity(&modelMatrix); D3DXMatrixInverse(&modelMatrixInverse, NULL, &modelMatrix); modelViewProjMatrix = modelMatrix * (*camera.GetViewMatrix()) * (*camera.GetProjMatrix());

22 paraméterátadás az effectnek effect-> SetMatrix("modelMatrix", &modelMatrix); effect-> SetMatrix("modelMatrixInverse", &modelMatrixInverse); effect-> SetMatrix("modelViewProjMatrix", &modelViewProjMatrix); effect->CommitChanges();

23 próba WASD + egér

24 textúrák class Lab2Transform : public LabInterface {... std::vector textures;

25 mesh betöltés anyaginfóval HRESULT Lab2Transform::createManagedResource s() { LPD3DXBUFFER materialBuffer; D3DXLoadMeshFromX( L"media\\buggy\\buggy.x", D3DXMESH_MANAGED, device, NULL, &materialBuffer, NULL, (DWORD*)&nSubMeshes, &mesh);

26 anyagok kibányászása D3DXMATERIAL* materialArray = (D3DXMATERIAL*) materialBuffer->GetBufferPointer();

27 textúrák betöltése for(int t=0; t<nSubMeshes; t++){ LPDIRECT3DTEXTURE9 texture; char textureFilePath[512]; strcpy(textureFilePath, "media\\buggy\\"); strcat(textureFilePath, materialArray[t].pTextureFilename); HRESULT hr = D3DXCreateTextureFromFileA( device, textureFilePath, &texture); if(hr == S_OK) textures.push_back(texture); else textures.push_back(NULL); }

28 textúrák felszabadítása HRESULT Lab2Transform::releaseManagedResources() { mesh->Release(); std::vector ::iterator i = textures.begin(); while(i != textures.end()) { if(*i != NULL) (*i)->Release(); } return S_OK; }

29 textúra sampler az effect fileban texture kdMap; sampler2D kdMapSampler = sampler_state{ texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; };

30 textúrázó pixel shader float4 psWhite(TrafoOutput input) : COLOR0 { return input.normal.y * tex2D(kdMapSampler, input.tex); }

31 rajzolás textúrákkal effect->BeginPass(0); for(int i=0; i<nSubMeshes; i++) { effect->SetTexture("kdMap", textures.at(i)); effect->CommitChanges(); mesh->DrawSubset(i); } effect->EndPass();


Letölteni ppt "Transzformációk, textúrák, árnyalás Szécsi László."

Hasonló előadás


Google Hirdetések