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

Számítógépes grafika DirectX 6. gyakorlat. Emlékeztető Múlt órán megvilágítással foglalkoztunk  Per vertex  Per pixel.

Hasonló előadás


Az előadások a következő témára: "Számítógépes grafika DirectX 6. gyakorlat. Emlékeztető Múlt órán megvilágítással foglalkoztunk  Per vertex  Per pixel."— Előadás másolata:

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

2 Emlékeztető Múlt órán megvilágítással foglalkoztunk  Per vertex  Per pixel

3 Tartalom Mesh-ek Indexelt primitívek

4 Összetett modellek Gyakorlatban elég ritkán készítjük el kóddal a programunkban használt modelleket Maya, 3D Studio Max, LighWave és hasonló modellezőprogramok biztosítanak számunkra is használható formátumba történő exportálást

5 Mesh Egy ilyen összetett modellt az ID3DXMESH interfészen keresztül és néhány D3DX-beli függvénnyel könnyen kezelhetünk Egy ilyen mesh tárolja a modellt alkotó csúcspontokat, anyagjellemzőket és textúrákat

6 Mesh-ek felépítése Megvalósítástól elvonatkoztatva tekinthetünk rájuk mint erőforrások és attribútumok közös tárolójára Erőforrások:  Textúrák  Anyagjellemzők (material-ok) Attribútumok:  Pozíció adatok  Szomszédsági adatok

7 Mesh-ek konkrétan Az előzőeket a következőkkel tárolja:  Vertex buffer  Index puffer  Attribútum puffer Az attribútumok a mesh egy-egy csúcspontjának tulajdonságait írják le

8 1. példa Mesh

9 Mit csinálunk? A múlt órai per pixel megvilágítós kódunkba írunk bele ( http://people.inf.elte.hu/valasek/bevgraf/05/M egoldasok/PerPixel.zip ) http://people.inf.elte.hu/valasek/bevgraf/05/M egoldasok/PerPixel.zip Ezt készítjük el: http://people.inf.elte.hu/valasek/bevgraf/06/01 _Meshes.zip http://people.inf.elte.hu/valasek/bevgraf/06/01 _Meshes.zip

10 DXMyApp.h class CDXMyApp : public CDXAppBase {... private: LPD3DXMESH m_pMesh;... };

11 CDXMyApp::CDXMyApp() { m_pVB = NULL; m_pTexture = NULL; m_pMesh = NULL; m_angle = 0; m_dist = 0; }

12 CDXMyApp:: InitDeviceObjects() HRESULT CDXMyApp::InitDeviceObjects() { D3DXCreateSphere(m_pD3DDevice, 1, 32, 32, &m_pMesh, 0); return S_OK; }

13 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); pDevice: érvényes device interfész mutató

14 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); Radius: létrehozandó gömb sugara

15 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); Slices: felbontás a főtengely körül

16 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); Stacks: felbontás a főtengely mentén

17 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); ppMesh: eredmény gömb

18 D3DXCreateSphere HRESULT D3DXCreateSphere( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency ); ppAdjacency: szomszédossági adatok, lehet NULL

19 CDXMyApp::Render() D3DXMATRIXA16 matWorld; D3DXMatrixTranslation(&matWorld,0,2,0); D3DXMatrixTranspose(&matWorld, &matWorld); cgD3D9SetUniformMatrix(m_CGparam_world, &matWorld); m_pMesh->DrawSubset(0);

20

21 Egyéb mesh-es konstruktorok HRESULT D3DXCreateTeapot( LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency );

22 Egyéb mesh-es konstruktorok HRESULT D3DXCreateTorus( LPDIRECT3DDEVICE9 pDevice, FLOAT InnerRadius, FLOAT OuterRadius, UINT Sides, UINT Rings, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency );

23 Egyéb mesh-es konstruktorok HRESULT D3DXCreateCylinder( LPDIRECT3DDEVICE9 pDevice, FLOAT Radius1, FLOAT Radius2, FLOAT Length, UINT Slices, UINT Stacks, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency );

24 Egyéb mesh-es konstruktorok HRESULT D3DXCreateBox( LPDIRECT3DDEVICE9 pDevice, FLOAT Width, FLOAT Height, FLOAT Depth, LPD3DXMESH * ppMesh, LPD3DXBUFFER * ppAdjacency );

25 Feladat Pattogtassuk a labdát a piramis tetején!  Az Y tengely mentén 2 egységnyit utazzon felfelé, aztán induljon vissza lefelé és a piramis „csúcsáról” pattanjon vissza  Ne csak pattogjon, hanem forogjon is a saját tengelye körül a gömb! Változzon folyamatosan a gömb színe is!

26 Feladat Miközben egy gömb pattog a piramis tetején az előbbieknek megfelelően, az Y = 3 síkban 10 teáskanna forogjon a piramis csúcspontja körüli 4 sugarú körön!  Ne csak a piramis körül forogjanak, hanem egy tetszőleges tengelyük körül is A teáskannák színei külön-külön változzanak!

27 Mesh-ek betöltése fájlból Tervező rendszerekben készített modellek betöltése D3DX library segít benne Ezt készítjük el: http://people.inf.elte.hu/valasek/bevgraf/06/02 _LoadMesh.zip http://people.inf.elte.hu/valasek/bevgraf/06/02 _LoadMesh.zip

28 DXMyApp.h class CDXMyApp : public CDXAppBase {…{… private: LPD3DXMESH m_pMesh; D3DMATERIAL9* m_pMeshMaterials; LPDIRECT3DTEXTURE9* m_pMeshTextures; DWORD m_dwNumMaterials; HRESULT LoadMesh(); VOID UnloadMesh();... };

29 CDXMyApp::CDXMyApp() {... m_pMesh = NULL; m_pMeshMaterials = NULL; m_pMeshTextures = NULL; m_dwNumMaterials = 0;... }

30 CDXMyApp::LoadMesh() HRESULT CDXMyApp::LoadMesh() { LPD3DXBUFFER pD3DXMtrlBuffer; D3DXLoadMeshFromX( TEXT("modell.x"), D3DXMESH_DEFAULT, m_pD3DDevice, NULL, &pD3DXMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMesh )...

31 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX( LPCTSTR pFilename,...) pFilename: betöltendő meshfájl neve

32 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX(... DWORD Options,...) Options: betöltési opciók (D3DXMESH):  D3DXMESH_VB_SYSTEMMEM, MANAGED, stb: létrejövő vertexbuffer memóriaosztálya  D3DXMESH_VB_WRITEONLY, DYNAMIC, stb: felhasználási mód  Index bufferekre hasonlók  D3DXMESH_SYSTEMMEM, stb: VB és IB is ez lesz

33 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX(... LPDIRECT3DDEVICE9 pD3DDevice,...) pD3DDevice: érvényes device mutató

34 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX(... LPD3DXBUFFER* ppAdjacency,...) ppAdjacency: kimeneti tároló a modell szomszédsági adatainak rögzítésére Lehet NULL is

35 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX(... LPD3DXBUFFER* ppMaterials,...) ppMaterials: kimeneti tároló a modell anyagainak (anyagok tömbje)

36 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX(... LPD3DXBUFFER* ppEffectInstances,...) ppEffectInstance: kimeneti tároló az effektekhez

37 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX( DWORD* pNumMaterials,...) pNumMaterials: a modell által használt anyagok száma

38 D3DXLoadMeshFromX HRESULT D3DXLoadMeshFromX( LPD3DXMESH * ppMesh,...) ppMesh: kimeneti mesh-ünk

39 CDXMyApp::LoadMesh()... D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer-> GetBufferPointer(); m_pMeshMaterials = new D3DMATERIAL9[m_dwNumMaterials]; if( m_pMeshMaterials == NULL ) return E_OUTOFMEMORY;...

40 CDXMyApp::LoadMesh()... m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNmMtrls]; if( m_pMeshTextures == NULL ) return E_OUTOFMEMORY;...

41 CDXMyApp::LoadMesh()... for (DWORD i=0; i<m_dwNMtrls; i++) { m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D; m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse; m_pMeshTextures[i] = NULL;...

42 CDXMyApp::LoadMesh() if(d3dxMaterials[i].pTextureFilename !=NULL) { D3DXCreateTextureFromFileA( m_pD3DDevice, d3dxMaterials[i].pTextureFilename, &m_pMeshTextures[i] ); } } // ciklus vége pD3DXMtrlBuffer->Release(); return S_OK; }

43 CDXMyApp::UnloadMesh() VOID CDXMyApp::UnloadMesh() { if ( m_pMesh != NULL ) { m_pMesh->Release(); m_pMesh = NULL; } if( m_pMeshMaterials != NULL ) delete[] m_pMeshMaterials;...

44 CDXMyApp::UnloadMesh() if( m_pMeshTextures ) { for( DWORD i = 0; i < m_dwNumMaterials; i++ ) { if( m_pMeshTextures[i] ) { m_pMeshTextures[i]->Release(); m_pMeshTextures[i] = NULL; } delete[] m_pMeshTextures; } } // ReleaseDeviceObjects vége

45 HRESULT CDXMyApp:: Render()... D3DXMATRIXA16 matWorld, matScale; D3DXMatrixTranslation(&matWorld, 0, 2, 0); D3DXMatrixScaling(&matScale, 0.02f, 0.02f, 0.02f); matWorld = matScale * matWorld ; D3DXMatrixTranspose(&matWorld, &matWorld); cgD3D9SetUniformMatrix(m_CGparam_world, &matWorld);...

46 HRESULT CDXMyApp:: Render() for ( DWORD i=0; i<m_dwNumMaterials; i++ ) { cgD3D9SetUniform( m_CGparam_mat_emissive, &m_pMeshMaterials[i].Emissive ); cgD3D9SetUniform( m_CGparam_mat_ambient, &m_pMeshMaterials[i].Ambient ); cgD3D9SetUniform( m_CGparam_mat_diffuse, &m_pMeshMaterials[i].Diffuse ); cgD3D9SetUniform( m_CGparam_mat_specular, &m_pMeshMaterials[i].Specular ); cgD3D9SetUniform( m_CGparam_mat_specular_power, &m_pMeshMaterials[i].Power ); cgD3D9SetTexture( m_CGparam_texture, m_pMeshTextures[i]); m_pMesh->DrawSubset( i ); }

47 Feladat Körözzön az űrhajó a piramis körül!  Az orra nézzen mindig a körpálya érintője felé  Legyen 60 fokban megdöntve a hossztengelye mentén

48

49

50 Feladat 30 űrhajó körözzön a piramis körül!

51


Letölteni ppt "Számítógépes grafika DirectX 6. gyakorlat. Emlékeztető Múlt órán megvilágítással foglalkoztunk  Per vertex  Per pixel."

Hasonló előadás


Google Hirdetések