Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos.

Hasonló előadás


Az előadások a következő témára: "Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos."— Előadás másolata:

1 Számítógépes grafika DirectX 7. gyakorlat

2 Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos dolgot

3 Tartalom 1. Index pufferek 2. Függvénykirajzoló

4 Egy apró kényelmetlenség Az eddig megismert primitívjeink (triangle list/strip/fan stb) használatával néha túlságosan redundáns csúcsponttárolásr kényszerülünk Háromszöglistával például egy egyszerű kocka tárolására 36 csúcspont kell Ha mi adhatnánk meg, hogy milyen sorrendben történjen a csúcsok összekötése jelentős megtakarításokat érhetnénk el

5 Index buffer Ha indexelt primitíveket használunk, akkor két tárolónk van:  Egy vertexbuffer a csúcspontoknak  És egy indexbuffer, ami vertexbufferbeli indexeket tárol. A benne lévő sorrendben köti össze a csúcsokat a D3D primitívkirajzoláskor

6

7

8

9

10 2. példa Indexelt primitívek

11 Mit csinálunk? Egy kockát rajzolunk ki indexelt primitívek segítségével Ez lesz az eredmény: http://people.inf.elte.hu/valasek/bevgraf/07/01_Indices.zip http://people.inf.elte.hu/valasek/bevgraf/07/01_Indices.zip

12 Vertex shader 1/2 struct vertexIn { float3 p : POSITION; float4 c : COLOR0; }; struct hvertexOut { float4 p : POSITION; float4 c : COLOR0; };

13 Vertex shader 2/2 hvertexOut main( vertexIn IN, uniform float4x4 worldViewProj ) { hvertexOut OUT; float4 v = float4(IN.p.x,IN.p.y,IN.p.z,1.0); OUT.p = mul( worldViewProj, v); OUT.c = IN.c; return OUT; }

14 Pixel shader 1/2 struct fragment { float4 p: POSITION; float4 c: COLOR0; }; struct pixel { float4 c: COLOR; };

15 Pixel shader 2/2 pixel main( fragment IN, uniform float4 cl ) { pixel OUT; OUT.c = cl; return OUT; }

16 DXMyApp.h class CDXMyApp : public CDXAppBase{... private: CGcontext m_CGcontext; CGprogram m_CGprogram_vertex; CGprogram m_CGprogram_pixel; CGparameter m_CGparam_color; CGparameter m_CGparam_worldViewProj;... A CG Context a shader programjaink tárolója A CGprogram típusú változók a shadereink azonosítóit fogják tartalmazni, amiken keresztül tud kommunikálni az alkalmazásunk a shader programokkal A CGparameter típusú változók a shaderprogramjaink „paraméterei” (uniform típusú változók), amelyeknek értéket adhatunk az alkalmazásunkból (pl. az m_CGparam_color a kirajzolási színt fogja jelenteni)

17 DXMyApp.h... D3DXMATRIXA16 matProj; LPDIRECT3DVERTEXBUFFER9 m_pVB; LPDIRECT3DINDEXBUFFER9m_pIB; float m_angleY; static const DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; struct Vertex { D3DXVECTOR3 p; DWORD c; }; }

18 CDXMyApp::CDXMyApp() { m_pVB = NULL; m_pIB = NULL; }

19 HRESULT CDXMyApp:: InitDeviceObjects() { m_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE); CUSTOMVERTEX vertices[8];...

20 HRESULT CDXMyApp:: InitDeviceObjects() { Vertex vertices[] = { {D3DXVECTOR3(-1,-1,-1), 0xffff0000 }, {D3DXVECTOR3( 1,-1,-1), 0xff00ff00 }, {D3DXVECTOR3( 1, 1,-1), 0xff0000ff }, {D3DXVECTOR3(-1, 1,-1), 0xff808080}, };...

21 HRESULT CDXMyApp:: InitDeviceObjects()... if( FAILED( m_pD3DDevice-> CreateVertexBuffer( 8*sizeof(CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) return E_FAIL;...

22 HRESULT CDXMyApp:: InitDeviceObjects()... VOID* pVertices; if( FAILED( m_pVB->Lock( 0, sizeof(vertices), &pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); m_pVB->Unlock();...

23 HRESULT CDXMyApp:: InitDeviceObjects()... WORD indices[] = {0,3,1, 3,2,1 }; m_pD3DDevice->CreateIndexBuffer( sizeof(indices)*sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_pIB, NULL);...

24 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); Length: a létrehozandó indexbuffer mérete bájtban

25 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); Usage: felhasználási mód, most D3DUSAGE_WRITEONLY

26 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); Format: a buffer formátuma:  D3DFMT_INDEX16, D3DFMT_INDEX32: 16 vagy 32 bites indexeket használunk

27 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); Pool: memóriaosztály

28 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); ppIndexBuffer: a kimeneti érték, egy indexbuffer interfészre mutató pointer címe

29 IDirect3DDevice9:: CreateIndexBuffer HRESULT CreateIndexBuffer( UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle ); pSharedHandle: kötelezően NULL

30 HRESULT CDXMyApp:: InitDeviceObjects()... m_pIB->Lock( 0, sizeof(indices), &pIndices, 0) ; memcpy( pIndices, indices, sizeof(indices) ); m_pIB->Unlock();...

31 CDXMyApp::InitDeviceObjects() m_CGcontext = cgCreateContext(); cgD3D9SetDevice( m_pD3DDevice ); CGprofile vertexProfile = cgD3D9GetLatestVertexProfile(); CGprofile pixelProfile = cgD3D9GetLatestPixelProfile(); const char **vertexOptions[] = { cgD3D9GetOptimalOptions( vertexProfile ), NULL, }; const char **pixelOptions[] = { cgD3D9GetOptimalOptions( pixelProfile ), NULL, }; Létrehozzuk a context-et és beállítjuk a CG-nek a device- unkat A shadereink txt fájlokban vannak, ezeket le kell fordítanunk. Itt a CG-n keresztül lekérdezzük az adott hardveren elérhető legújabb vertex és fragment shader verziókat Beállítjuk a shadereink fordítási paramétereit – a legújabb profilra akarunk fordítani

32 CDXMyApp::InitDeviceObjects()... m_CGprogram_vertex = cgCreateProgramFromFile( m_CGcontext, CG_SOURCE, "vs.cg", vertexProfile, "main", *vertexOptions );... Hogyan hozzuk létre a shadert: CG_SOURCE: forrásfájlból CG_OBJECT: lefordított objektum kódból Context amibe rakjuk a shadert Fordítandó shader fájlneve Fordítási cél shader modell A shader belépési pontja Compiler opciók

33 CDXMyApp::InitDeviceObjects()... m_CGprogram_pixel = cgCreateProgramFromFile( m_CGcontext, CG_SOURCE, "ps.cg", pixelProfile, "main", *pixelOptions );...

34 CDXMyApp::InitDeviceObjects() cgD3D9LoadProgram( m_CGprogram_vertex, TRUE, 0 ); cgD3D9LoadProgram( m_CGprogram_pixel, TRUE, 0 ); m_CGparam_worldViewProj = cgGetNamedParameter( m_CGprogram_vertex, "worldViewProj" ); m_CGparam_color = cgGetNamedParameter( m_CGprogram_pixel, "cl" );... A D3D-nek megfelelő shader létrehozása a lefordított CG shaderekből A cgGetNamedParameter az első paraméterben megadott shaderből a második paraméterben megadott nevű, uniform változó azonosítóját adja vissza, hogy annak értékét a CG- n keresztül tudjuk a programunkból módosítani

35 CDXMyApp::InitDeviceObjects()... D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/2, m_BBWidth/ (float)m_BBHeight, 0. 1f, 100); return S_OK; }

36 VOID CDXMyApp:: ReleaseDeviceObjects() { cgD3D9SetDevice(NULL); cgDestroyProgram(m_CGprogram_vertex); cgDestroyProgram(m_CGprogram_pixel); cgDestroyContext(m_CGcontext); if (m_pIB != NULL) { m_pIB->Release(); m_pIB = NULL; } if (m_pVB != NULL) { m_pVB->Release(); m_pVB = NULL; } }

37 VOID CDXMyApp::FrameUpdate() { D3DXMATRIXA16 matWorld; D3DXMATRIXA16 matView; D3DXMatrixIdentity(&matWorld); D3DXMatrixRotationY(&matWorld, m_angleY); D3DXVECTOR3 vEye(0, 4, 4); D3DXVECTOR3 vAt(0, 0, 0); D3DXVECTOR3 vUp(0, 1, 0);...

38 VOID CDXMyApp::FrameUpdate()... D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); D3DXMATRIX worldViewProj = matWorld * matView * matProj ; D3DXMatrixTranspose(&worldViewProj, &worldViewProj); cgD3D9SetUniformMatrix( m_CGparam_worldViewProj, &worldViewProj ); } A cgD3D9SetUniformMatrix segítségével shadereink uniform float4x4 típusú paramétereinek adhatunk értéket, a második paraméterben megadott memóriacímen található tartalommal

39 VOID CDXMyApp::Render()... m_pD3DDevice->SetFVF(FVF); D3DXVECTOR4 vConstColor( 0.4f, 1.0f, 0.7f, 0.0f ); cgD3D9SetUniform( m_CGparam_color, &vConstColor ); cgD3D9BindProgram( m_CGprogram_vertex ); cgD3D9BindProgram( m_CGprogram_pixel ); m_pD3DDevice->SetStreamSource(0,m_pVB,0,sizeof(Vertex)); m_pD3DDevice->SetIndices( m_pIB ); m_pD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);... A cgD3D9SetUniform-mal egy shader uniform paraméternek adhatunk értéket (kivéve sampler-nek!) – az, hogy ez hány bájtnyi adat kell hogy legyen, a cgD3D9TypeToSize és cgGetParameterType segítségével kérdezhető le Aktiváljuk a vertex és fragment shadereinket

40 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); Type: kirajzolandó primitív típus

41 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); BaseVertex: a vertexpuffer hányadik eleme lesz a nullás indexű tag

42 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); MinIndex: legalacsonyabb vertex index érték, amit használunk a kirajzoláskor

43 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); NumVertices: felhasznált csúcspontok száma

44 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); StartIndex: indexpufferbeli offset

45 IDirect3DDevice9:: DrawIndexedPrimitive HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount); Type: kirajzolt primitívek száma

46 Feladat Készítsünk egy kockát!

47 Feladat Az egér fel/le mozgatásával az X tengely körül forogjon a kocka

48 Feladat Csináljunk egy „repülő kamerát” D3DXVec3Normalize( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV ) : egységvektorrá alakítja pV-t D3DXVec3Cross( D3DXVECTOR3 * pOut, CONST D3DXVECTOR3 * pV1, CONST D3DXVECTOR3 * pV2 ) : pOut = pV1 x pV2

49 Tartalom 1. Index pufferek 2. Függvénykirajzoló

50 Letölteni Innen: http://people.inf.elte.hu/valasek/bevgraf/07/02 _Functions.zip http://people.inf.elte.hu/valasek/bevgraf/07/02 _Functions.zip


Letölteni ppt "Számítógépes grafika DirectX 7. gyakorlat. Emlékeztető Múlt órán mesheket és transzformációkat használtunk Most primitívkirajzoláshoz nézünk meg egy hasznos."

Hasonló előadás


Google Hirdetések