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

/*
需要包含以下库
d3d9.lib
d3dx9.lib
winmm.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 REF
				IDirect3DDevice9** 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 REF
	IDirect3DDevice9** 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;
}


你可能感兴趣的:(第一个DirectX9.0 3D应用实例)