#ifndef _D3DC3E1_H_ #define _D3DC3E1_H_ #include "SD3dBase.h" class D3DC3E1:public SD3dBase { public: D3DC3E1(const TCHAR* szTitle):SD3dBase(true,szTitle) { m_pVB = NULL; m_pIB = NULL; } ~D3DC3E1(){} public: virtual bool UserInitRes(); virtual void UserDelRes(); virtual bool UserFrameFunc(float dt); virtual bool UserRenderFunc(); private: // 顶点缓存 IDirect3DVertexBuffer9* m_pVB; // 索引缓存 IDirect3DIndexBuffer9* m_pIB; }; // 顶点 struct Vertex { Vertex(){} Vertex(float x,float y,float z) { _x=x;_y=y;_z=z; } float _x,_y,_z; static const DWORD FVF; }; #endif
#include "TestD3d.h" const DWORD Vertex::FVF = D3DFVF_XYZ; bool D3DC3E1::UserInitRes() { // 初始化资源 // 创建顶点缓存 m_pDevice->CreateVertexBuffer( 8 * sizeof(Vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &m_pVB, 0); // 创建索引缓存 // 36个三角形 36个索引 m_pDevice->CreateIndexBuffer( 36 * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pIB, 0); // 填充顶点 步骤 锁顶点缓存 得到缓存指针 填充数据 解锁 Vertex* pVex = NULL; m_pVB->Lock( 0, 8 * sizeof(Vertex), (void**)&pVex, 0); pVex[0] = Vertex(-1.0f,-1.0f,-1.0f); pVex[1] = Vertex(-1.0f,1.0f,-1.0f); pVex[2] = Vertex(1.0f,1.0f,-1.0f); pVex[3] = Vertex(1.0f,-1.0f,-1.0f); pVex[4] = Vertex(-1.0f,-1.0f,1.0f); pVex[5] = Vertex(-1.0f,1.0f,1.0f); pVex[6] = Vertex(1.0f,1.0f,1.0f); pVex[7] = Vertex(1.0f,-1.0f,1.0f); m_pVB->Unlock(); // 填充索引 WORD* pWord = NULL; m_pIB->Lock( 0, 0, (void**)&pWord, 0); // 前面2个三角形 pWord[0] = 0;pWord[1] = 1;pWord[2] = 2; pWord[3] = 0;pWord[4] = 2;pWord[5] = 3; // 后边 pWord[6] = 4;pWord[7] = 6;pWord[8] = 5; pWord[9] = 4;pWord[10] = 7;pWord[11] = 6; // 左边 pWord[12] = 4;pWord[13] = 5;pWord[14] = 1; pWord[15] = 4;pWord[16] = 1;pWord[17] = 0; // 右边 pWord[18] = 3;pWord[19] = 2;pWord[20] = 6; pWord[21] = 3;pWord[22] = 6;pWord[23] = 7; // 顶部 pWord[24] = 1;pWord[25] = 5;pWord[26] = 6; pWord[27] = 1;pWord[28] = 6;pWord[29] = 2; // 底部 pWord[30] = 4;pWord[31] = 0;pWord[32] = 3; pWord[33] = 4;pWord[34] = 3;pWord[35] = 7; m_pIB->Unlock(); // 坐标变换 // 摄像机坐标 D3DXVECTOR3 position(0.0f,0.0f,-5.0f); // 观察物体坐标 D3DXVECTOR3 target(0.0f,0.0f,0.0f); // 上方向 D3DXVECTOR3 up(0.0f,1.0f,0.0f); // 获得观察坐标系的矩阵 D3DXMATRIX v; D3DXMatrixLookAtLH(&v,&position,&target,&up); m_pDevice->SetTransform(D3DTS_VIEW,&v); // 获得投影坐标系矩阵 D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH( &proj, D3DX_PI * 0.5f, (float)GetViewWidth()/(float)GetViewHeight(), 1.0f, 1000.0f); m_pDevice->SetTransform(D3DTS_PROJECTION,&proj); m_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); return SD3dBase::UserInitRes(); } void D3DC3E1::UserDelRes() { SD3dBase::Release<IDirect3DIndexBuffer9*>(m_pIB); SD3dBase::Release<IDirect3DVertexBuffer9*>(m_pVB); } bool D3DC3E1::UserFrameFunc(float dt) { // 运算 static float fTotalTime = 0; D3DXMATRIX rx,ry; fTotalTime += dt; if(fTotalTime >= 6.28f) { fTotalTime = 0.0f; } D3DXMatrixRotationX(&rx,3.14f / 4.0f); D3DXMatrixRotationY(&ry,fTotalTime); D3DXMATRIX r = rx * ry; m_pDevice->SetTransform(D3DTS_WORLD,&r); return SD3dBase::UserFrameFunc(dt); } bool D3DC3E1::UserRenderFunc() { m_pDevice->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); m_pDevice->BeginScene(); m_pDevice->SetStreamSource(0,m_pVB,0,sizeof(Vertex)); m_pDevice->SetIndices(m_pIB); m_pDevice->SetFVF(Vertex::FVF); m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12); m_pDevice->EndScene(); m_pDevice->Present(0,0,0,0); return SD3dBase::UserRenderFunc(); }