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