第一个DirectX9.0 3D应用实例

来源:互联网 发布:影响期货行情三大数据 编辑:程序博客网 时间:2024/06/13 06:38
/*需要包含以下库d3d9.libd3dx9.libwinmm.lib          */#include <d3dx9.h>namespace d3d {bool InitD3D(HWND hwd, HINSTANCE hInstance, //[in]应用程序实例int width, int height,//[in]Back buffer尺寸bool windowed,        //[in]是否全屏D3DDEVTYPE deviceType,//[in]HAL or REFIDirect3DDevice9** device); //[out]创建的设备LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);int EnterMsgLoop(bool(*ptr_display)(float timeDelta));template<class T>void Release(T t){if (t){t->Release();t = 0;}}template<class T>void Delete(T t){if (t){delete t;t = 0;}}}


#include "stdafx.h"#include "d3dUtility.h"bool d3d::InitD3D(HWND hwd, HINSTANCE hInstance, //[in]应用程序实例int width, int height,//[in]Back buffer尺寸bool windowed,        //[in]是否全屏D3DDEVTYPE deviceType,//[in]HAL or REFIDirect3DDevice9** device) //[out]创建的设备{// ***第一步,获得IDirect3D9接口IDirect3D9* _d3d9;_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);if (_d3d9 == NULL) return false;// ***第二步,检查设备能力D3DCAPS9 caps;_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, //主显示设备deviceType, //设备类型&caps);//是否支持使用硬件顶点处理?int vp = 0;if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){//是,支持硬件顶点处理vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;}else{//不,只能用软件顶点处理vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;}//***第三步,初始化D3DPRESENT_PARAMETERS结构D3DPRESENT_PARAMETERS d3dpp;d3dpp.BackBufferWidth = width;d3dpp.BackBufferHeight = height;d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式d3dpp.BackBufferCount  = 1;d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;d3dpp.MultiSampleQuality = 0;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.hDeviceWindow = hwd;d3dpp.Windowed = windowed;d3dpp.EnableAutoDepthStencil = true;d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;d3dpp.Flags = 0;d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//***第四步,创建IDirect3DDevice9对象HRESULT hr = _d3d9->CreateDevice(D3DADAPTER_DEFAULT, deviceType, hwd, vp, &d3dpp, device);if (FAILED(hr)){::MessageBox(0, "CreateDevice() - FAILED", 0, 0);return false;}return true;}LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){switch (msg){case WM_DESTROY:::PostQuitMessage(0);break;case WM_KEYDOWN:if (wParam==VK_ESCAPE)::PostQuitMessage(0);//::DestoryWindow(hwnd);break;}return ::DefWindowProc(hwnd, msg, wParam, lParam);}int d3d::EnterMsgLoop(bool(*ptr_display)(float timeDelta)){MSG msg;::ZeroMemory(&msg, sizeof(MSG));static float lastTime = 0; //(float)timeGetTime();while (msg.message!=WM_QUIT){if (::PeekMessage(&msg,0,0,0,PM_REMOVE)){::TranslateMessage(&msg);::DispatchMessage(&msg);}else{float currTime = 0; //(float)timeGetTime();float timeDelta = (currTime - lastTime)*0.001f;ptr_display(timeDelta);lastTime = currTime;}}return msg.wParam;}