步骤:
1. 获得一个IDirect3D9接口指针。这个接口用于获得物理设备的信息和创建一个
IDirect3DDevice9接口,它是一个代表我们显示3D图形的物理设备的C++对象。2. 检查设备能力(D3DCAPS9),搞清楚主显卡是否支持硬件顶点处理。我们需要知道假如它
能支持,我们就能创建IDirect3DDevice9接口。3. 初始化一个D3DPRESENT _PARAMETERS结构实例,这个结构包含了许多数据成员允许我
们指定将要创建的IDirect3DDevice9接口的特性。4. 创建一个基于已经初始化好的D3DPRESENT _PARAMETERS结构的IDirect3DDevice9对
象。它是一个代表我们显示3D图形的物理设备的C++对象。
- #include <d3dx9.h>
- #include <string.h>
- #include <Windows.h>
- #define WINDOWNAME TEXT("D3DGameFrame")
- #define WINDOWCLASS TEXT("The GameFrame of Dull")
- #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
- #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
- const int Width = 640;
- const int Height = 480;
- HWND mainWindowHandle = NULL;
- HINSTANCE hinstanceApp = NULL;
- bool ESC = true;
- IDirect3DDevice9* Device = NULL;
- IDirect3D9* d3d9 = NULL;
- HRESULT hr = NULL;
- LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT ps;
- HDC hdc;
- switch( msg )
- {
- case WM_PAINT:
- {
- hdc = BeginPaint(hWnd,&ps);
- EndPaint(hWnd,&ps);
- }
- break;
- case WM_DESTROY:
- {
- ::PostQuitMessage(0);
- }
- break;
- }
- return ::DefWindowProc(hWnd, msg, wParam, lParam);
- }
- int GameInit(void *parms = NULL, int num_parms = 0)
- {
- ESC = false;
- return 1;
- }
- int GameMain(void *parms = NULL, int num_parms = 0)
- {
- if(ESC) return 0;
- if (KEYDOWN(VK_ESCAPE))
- {
- ESC = true;
- SendMessage(mainWindowHandle,WM_CLOSE,0,0);
- }
- return 1;
- }
- int GameShutdown(void *parms = NULL, int num_parms = 0)
- {
- if( NULL != d3d9)
- {
- d3d9->Release();
- d3d9 = NULL;
- }
- if( NULL != Device)
- {
- Device->Release();
- Device = NULL;
- }
- return 1;
- }
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE prevInstance,
- PSTR cmdLine,
- int showCmd)
- {
- HWND hWnd;
- MSG msg;
- WNDCLASS wndClass;
- wndClass.style = CS_HREDRAW | CS_VREDRAW;
- wndClass.lpfnWndProc = (WNDPROC)WndProc;
- wndClass.cbClsExtra = NULL;
- wndClass.cbWndExtra = NULL;
- wndClass.hInstance = hInstance;
- wndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
- wndClass.hCursor = LoadCursor(0, IDC_ARROW);
- wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wndClass.lpszMenuName = NULL;
- wndClass.lpszClassName = WINDOWCLASS;
- if( !RegisterClass(&wndClass) )
- {
- ::MessageBox(NULL, TEXT("RegisterClass() - FAILED"), NULL, NULL);
- return false;
- }
- hWnd = CreateWindow(WINDOWCLASS,
- WINDOWNAME,
- WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- 0, 0,
- Width,
- Height,
- NULL,
- NULL,
- hInstance,
- NULL);
- if( !hWnd )
- {
- ::MessageBox(NULL,TEXT( "CreateWindow() - FAILED"), NULL, NULL);
- return false;
- }
- hinstanceApp = hInstance;
- mainWindowHandle = hWnd;
- ::ShowWindow(hWnd, SW_SHOW);
- ::UpdateWindow(hWnd);
- //1: 获得一个IDirect3D9接口指针。
- d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
- /*Direct3DCreate9 的唯一一个参数总是D3D_SDK_VERSION,
- 这可以保证应用程序通过正确的头文件被生成。如果函数调用失败,
- 那么它将返回一个空指针。*/
- if( !d3d9 )
- {
- ::MessageBox(NULL, TEXT("Direct3DCreate9() - FAILED"), NULL, NULL);
- return false;
- }
- //2:检查设备能力(D3DCAPS9),搞清楚主显卡是否支持硬件顶点处理。.
- //当我们创建一个IDirect3DDevice9对象来表示主显示设备时,必须要设定其顶点处理的类型。
- D3DCAPS9 caps;
- d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);// 填充主显示设备的能力(D3DCAPS9结构)
- int vp = 0;
- if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
- vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
- else
- vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- //3: 初始化一个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 = hWnd;
- d3dpp.Windowed = true;
- d3dpp.EnableAutoDepthStencil = true;
- d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
- d3dpp.Flags = 0;
- d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
- d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- //4:创建一个基于已经初始化好的D3DPRESENT _PARAMETERS结构的IDirect3DDevice9对象。
- hr = d3d9->CreateDevice(//Creates a device to represent the display adapter.
- D3DADAPTER_DEFAULT, // primary adapter
- D3DDEVTYPE_HAL, // device type
- hWnd, // window associated with device
- vp, // vertex processing
- &d3dpp, // present parameters
- &Device); // return created device
- if( FAILED(hr) )
- {
- d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
- hr = d3d9->CreateDevice(
- D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL,
- hWnd,
- vp,
- &d3dpp,
- &Device);
- if( FAILED(hr) )
- {
- d3d9->Release(); //释放d3d9
- ::MessageBox(NULL, TEXT("CreateDevice() - FAILED"), NULL, NULL);
- return false;
- }
- }
- GameInit();
- while(TRUE)
- {
- if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
- {
- if (msg.message == WM_QUIT)
- break;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- GameMain();
- }
- GameShutdown();
- return 0;
- }
转载于:https://blog.51cto.com/heweiyou/1130330