Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaZsigmond Balog Megváltozta több, mint 10 éve
1
DirectX9 empty project Szécsi László
2
Project létrehozása Microsoft DirectX SDK (August 2008) telepítése Start Menu \ Microsoft DirectX SDK (August 2008)\ Sample browser Empty project (C++) July 2004 telepítése (D: vagy saját home) project name: GraphGame
3
Próba Build Run eredmény: include hiba megoldás: Project properties/ C++/ Additional include directories + >\include
4
Próba Build Run eredmény: linkelési hiba megoldás: Project properties/ C++/ Additional library directories + >\lib\x86
5
Próba Build Run eredmény: üres kék képernyő
6
Nézzük a kódot! Callback függvények események kezelésére IDirect3DDevice9 interface
7
Hozzunk létre saját OO interfacet Class View / right click / New Folder “Lab1” Class View / right click / Add Class “EngineInterface” ebből fogjuk majd a laborokon az aktuális effektet megvalósító osztályt származtatni
8
Drag&Drop Class View drag & drop EngineInterface -> Lab1
9
új tagváltozó: device class EngineInterface{ protected: LPDIRECT3DDEVICE9 device; … ez mindig kelleni fog
10
Gyári konstruktor és destruktor nem kell töröljük őket
11
új metódusok EngineInterface(LPDIRECT3DDEVICE9 device) {this->device = device;} virtual HRESULT createManagedResources() {return S_OK;} virtual HRESULT createDefaultResources() {return S_OK;}
12
új metódusok virtual HRESULT releaseManagedResources() {return S_OK;} virtual HRESULT releaseDefaultResources() {return S_OK;}
13
új metódusok virtual void animate (double dt, double t){} virtual void processMessage ( UINT uMsg, WPARAM wParam, LPARAM lParam){} virtual void render(){}
14
LabInterface kész
15
Lab1HLSL : LabInterface Class view, Add Class: “Lab1HLSL” Base class: “EngineInterface”
16
Globális példány GraphGame.cpp: #include “EngineInterface.h" #include "Lab1HLSL.h" EngineInterface* engine = NULL; amíg nem hoztuk létre legyen NULL
17
Példány létrehozás/törlés OnCreateDevice: engine = new Lab1HLSL(pd3dDevice); return engine-> createManagedResources(); OnDestroyDevice: engine-> releaseManagedResources(); delete engine;
18
Reset/Lost esemény OnResetDevice: return engine-> createDefaultResources(); OnLostDevice: engine-> releaseDefaultResources();
19
Többi esemény OnFrameMove: if(engine) engine->animate (fElapsedTime, fTime); OnFrameRender: if(engine) engine->render(); a többit töröljük MsgProc: if(engine) engine->processMessage (uMsg, wParam, lParam);
20
Az alap kész van Most már implementálhatjuk amit akarunk a Lab1HLSL-ben
21
új metódusok Lab1HLSL: HRESULT createDefaultResources(); HRESULT releaseDefaultResources(); void render();
22
Vertex buffer változó class Lab1HLSL : public EngineInterface { LPDIRECT3DVERTEXBUFFER9 vertexBuffer;
23
Vertex buffer létrehozása HRESULT Lab1HLSL::createDefaultResources(){ device->CreateVertexBuffer( 4 * sizeof(D3DXVECTOR3), D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_DEFAULT, &vertexBuffer, NULL);...
24
Vertex buffer feltöltése... D3DXVECTOR3* vertexData; vertexBuffer->Lock(0, 0, (void**)&vertexData, D3DLOCK_DISCARD); vertexData[0] = D3DXVECTOR3(-1.0f, 1.0f, 0.0f); vertexData[1] = D3DXVECTOR3(1.0f, 1.0f, 0.0f); vertexData[2] = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); vertexData[2] = D3DXVECTOR3(1.0f, -1.0f, 0.0f); vertexBuffer->Unlock();
25
Vertex buffer felszabadítása HRESULT Lab1HLSL:: releaseDefaultResources() { vertexBuffer->Release(); return S_OK; }
26
rajzolás: kép törlése void Lab1HLSL::render(){ HRESULT hr; device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0);...
27
rajzolás: render... device->BeginScene(); device->SetStreamSource(0, vertexBuffer, 0, sizeof(D3DXVECTOR3)); device->SetFVF(D3DFVF_XYZ); device->DrawPrimitive (D3DPT_TRIANGLESTRIP, 0, 2); device->EndScene(); }
28
próba fekete téglalap, lefedi a viewportot (változtasuk meg a csúcskoordinátákat, hogy ne fedje le, próba, aztán vissza)
29
shaderek Effect (.fx) file HLSL függvények pass: render state és shaderek technique: pass lista + globális változók (uniform paraméterek minden shadernek)
30
effect interface ID3DXEffect interface magasabb szintű absztrakció a device felett a device „párja” lesz alapműveletekhez a devicehoz fordulunk pl. shader paraméterek beállítása az effecten keresztül
31
Lab1HLSL.fx // vertex shader: float4 idleVS( in float4 pos : POSITION ) : POSITION { return pos; }
32
Lab1HLSL.fx // pixel shader: float4 whitePS() : COLOR0 { return float4(1, 1, 1, 1); }
33
technique technique white{ pass ExamplePass{ ZEnable = TRUE; VertexShader = compile vs_2_0 idleVS(); PixelShader = compile ps_2_0 whitePS(); }
34
effect példány class Lab1HLSL : public LabInterface { LPD3DXEFFECT effect;
35
effect létrehozás HRESULT Lab1HLSL::createDefaultResources() { D3DXCreateEffectFromFile(device, L”Lab1HLSL.fx”, NULL, NULL, 0, NULL, &effect, NULL);
36
effect felszabadítás HRESULT Lab1HLSL:: releaseDefaultResources() { effect->Release();
37
rajzolás effecttel device->BeginScene(); effect->SetTechnique("white"); UINT a; effect->Begin(&a, 0); effect->BeginPass(0); // ide jön a draw call
38
rajzolás effecttel effect->EndPass(); effect->End(); device->EndScene();
39
próba fehér téglalap
40
mesh object class Lab1HLSL : public LabInterface { LPD3DXMESH mesh;
41
létrehozás HRESULT Lab1HLSL::createDefaultResources() { D3DXLoadMeshFromX(L"helix.x", 0, device, NULL, NULL, NULL, NULL, &mesh);
42
felszabadítás HRESULT Lab1HLSL:: releaseDefaultResources() { mesh->Release();
43
rajzolás // ide jön a draw call mesh->DrawSubset(0);
44
mesh vertex shaderben: return float4(pos.xzy * 0.1, 1);
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.