逐梦猎人

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用ID3DXMesh 绘制茶壶

View Code
  1 #include <Windows.h>
  2 #include <d3dx9.h>
  3 #include <d3d9.h>
  4 
  5 #pragma comment(lib,"d3dx9.lib")
  6 #pragma comment(lib,"d3d9.lib")
  7 #pragma comment(lib,"winmm.lib")
  8 //全局变量
  9 LPDIRECT3D9            g_pD3D = NULL;
 10 LPDIRECT3DDEVICE9    g_pDevice = NULL;
 11 
 12 const int width = 800;
 13 const int height = 600;
 14 
 15 ID3DXMesh* pTeaPotMesh = NULL;        //茶壶网格数据的指针
 16 
 17 //初始化d3d
 18 HRESULT InitD3D( HWND hWnd )
 19 {
 20     g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
 21     if( !g_pD3D )
 22     {
 23         return S_FALSE;
 24     }
 25     
 26     D3DPRESENT_PARAMETERS    d3dpp;
 27     ZeroMemory(&d3dpp,sizeof(d3dpp));
 28     d3dpp.BackBufferWidth            = width;
 29     d3dpp.BackBufferHeight           = height;
 30     d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
 31     d3dpp.BackBufferCount            = 1;
 32     d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
 33     d3dpp.MultiSampleQuality         = 0;
 34     d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
 35     d3dpp.hDeviceWindow              = hWnd;
 36     d3dpp.Windowed                   = TRUE;        //FLASE 表示全屏
 37     d3dpp.EnableAutoDepthStencil     = true; 
 38     d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
 39     d3dpp.Flags                      = 0;
 40     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
 41     d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;
 42 
 43     //创建设备
 44     HRESULT res  = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pDevice);
 45     if (FAILED( res))
 46     {
 47         return S_FALSE;
 48     }
 49 
 50     return S_OK;
 51 }
 52 //释放资源
 53 void CleanUp(void )
 54 {
 55     if(pTeaPotMesh ) pTeaPotMesh->Release();
 56     if(g_pDevice) g_pDevice->Release();
 57     if(g_pD3D) g_pD3D->Release();
 58 }
 59 
 60 //初始化网格数据
 61 bool InitMeshData()
 62 {
 63     //创建网格数据
 64     D3DXCreateTeapot(g_pDevice,&pTeaPotMesh,0);
 65     if (!pTeaPotMesh )
 66     {
 67         return false;
 68     }
 69     //进行取景变换
 70     D3DXVECTOR3     cameraPos(0.0f,0.0f,-5.0f);    //世界坐标系中的摄像机位置
 71     D3DXVECTOR3     targetPos(0.0f,0.0f,0.0f);        //观察点坐标系
 72     D3DXVECTOR3     worldUp(0.0f,1.0f,0.0f);        //世界坐标系中表示向上的分量
 73     
 74     //定义取景变换矩阵
 75     D3DXMATRIX    viewMat;
 76     //获取取景变换矩阵
 77     D3DXMatrixLookAtLH(&viewMat,&cameraPos,&targetPos,&worldUp);
 78     g_pDevice->SetTransform(D3DTS_VIEW,&viewMat);
 79 
 80     //投影变换
 81     D3DXMATRIX    projMat;  //定义投影变换矩阵
 82     //获取投影变换矩阵
 83     D3DXMatrixPerspectiveFovLH(&projMat,D3DX_PI *0.5f,(float)width/height,1.0f,1000.0f);
 84     //设置投影变换
 85     g_pDevice->SetTransform(D3DTS_PROJECTION,&projMat);
 86 
 87     //设置渲染模式,切换到线框模式
 88     g_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
 89     return true;
 90 }
 91 //渲染函数
 92 void Render(float deltaTime)
 93 {    
 94     //绕Y轴旋转
 95     D3DXMATRIX Ry;
 96     static float y = 0.0f;
 97     D3DXMatrixRotationY(&Ry,y);
 98     y += deltaTime;
 99     
100     if(y >= D3DX_PI *2.0f)
101         y = 0.0f;
102 
103     //世界变换
104     g_pDevice->SetTransform(D3DTS_WORLD,&Ry);
105     
106     //清空屏幕为白色
107     g_pDevice->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0);
108 
109     //开始绘制
110     if (SUCCEEDED(g_pDevice->BeginScene()))
111     {
112         //绘制茶壶
113         if (pTeaPotMesh)
114         {
115             pTeaPotMesh->DrawSubset(0);
116         }
117         g_pDevice->EndScene();
118         g_pDevice->Present(0,0,0,0);
119     }
120 }
121 
122 //窗口过程声明
123 LRESULT WINAPI MgsProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam );
124 
125 //winmain
126 int WINAPI WinMain(HINSTANCE hinstance,
127                    HINSTANCE prevInstance, 
128                    PSTR cmdLine,
129                    int showCmd)
130 {
131     WNDCLASSEX wc =
132     {
133         sizeof( WNDCLASSEX ), CS_CLASSDC, MgsProc, 0L, 0L,
134         GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
135         "Mesh", NULL
136     };
137     RegisterClassEx( &wc );
138 
139     // Create the application's window
140     HWND hWnd = CreateWindow("Mesh", "Mesh",
141         WS_OVERLAPPEDWINDOW, 100, 100, width, height,
142         NULL, NULL, wc.hInstance, NULL );
143     
144     if(SUCCEEDED(InitD3D(hWnd)))
145     {
146         if (InitMeshData())
147         {
148             //显示窗口
149             ShowWindow(hWnd,SW_SHOWDEFAULT);
150             UpdateWindow(hWnd);
151 
152             MSG msg;
153             ZeroMemory(&msg,sizeof(MSG));
154             while(msg.message != WM_QUIT )
155             {
156                 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
157                 {
158                     TranslateMessage( &msg );
159                     DispatchMessage( &msg );
160                 }
161                 else
162                 {
163                     //游戏循环
164                     static float lastTime = (float)timeGetTime();
165                     float curTime = (float)timeGetTime();
166                     float timeDelta = (curTime - lastTime)*0.001f;
167                     Render(timeDelta);
168                     lastTime = curTime;
169                 }
170             }
171         }
172     }
173     return 0;
174 }
175 
176 //窗口过程函数
177 LRESULT WINAPI MgsProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam )
178 {
179     switch( msg )
180     {
181     case WM_DESTROY:
182         {
183             CleanUp();
184             PostQuitMessage(0);
185             return 0;
186         }
187     }
188     return DefWindowProc(hwnd,msg,wParam,lParam);
189 }

 

posted on 2012-11-28 23:57  让知识沉淀  阅读(204)  评论(0)    收藏  举报