时间:2016-01-26 22:58 来源: 我爱IT技术网 作者:佚名
本文所分享的知识点是【【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化】,欢迎您喜欢52ij所分享的新闻、攻略、电脑教程及手机知识等经验,下面是详细的讲解。
【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化
#include "d3dUtility.h"
namespace d3d {
bool InitD3D( HINSTANCE hInstance, int width, int height, bool windowed, D3DDEVTYPE deviceType, IDirect3DDevice9 **device) {
HWND hwnd; //窗口句柄
WNDCLASS wndclass; //窗口类别,在CreateWindow之前需要RegisterClass , 针对WNDCLASS的参数可以了解一下API
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=(WNDPROC)d3d::WndProc; //WndProc
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor=LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground=(HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName=NULL ;
wndclass.lpszClassName=_T("Direct3D9App");
if( !RegisterClass(&wndclass) ) {
MessageBox(0, _T("This program requires windows NT!"), 0, 0);
return false;
}
hwnd=CreateWindow(_T("Direct3D9App"),_T("Direct3D9App"),WS_EX_TOPMOST,0,0,width,height,0,0,hInstance,0);
::ShowWindow(hwnd,SW_SHOW);
::UpdateWindow(hwnd);
//完成了主窗口初始化的过程,以下部分实现Direct3D的初始化过程,并且设置IDirect3DDevice9指针
IDirect3D9 *_d3d9;
_d3d9=Direct3DCreate9(D3D_SDK_VERSION); //获取IDirect3D9的指针,进行设备的迭代,检测特性&获取IDirect3DDevice9指针准备
if( !_d3d9 )
{
::MessageBox(0, _T("Direct3DCreate9() - FAILED"), 0, 0);
return false;
}
D3DCAPS9 caps; //检测图形设备的支持的特性
_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp=0; //是否支持硬件顶点运算
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else {
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
D3DPRESENT_PARAMETERS d3dpp; //D3DPRESENT_PARAMETERS设置,设置IDirect3DDevice的特性
::ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
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=windowed;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT hr=_d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, device);
if( FAILED(hr) ) {
::MessageBox(0, _T("CreateDevice() - Failed"), 0, 0);
return false;
}
return true;
}
int EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) {
MSG msg;
::ZeroMemory( &msg, sizeof(MSG) );
static float lastTime=(float)timeGetTime();
while(msg.message !=WM_QUIT) {
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else { //空闲的时候进行绘制
float currTime=(float)timeGetTime();
float timeDelta=(currTime - lastTime)*0.001f;
ptr_display(timeDelta);
lastTime=currTime;
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch( msg ) {
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if(wParam==VK_ESCAPE) //esc退出主窗口程序
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
}
关于【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化的相关讨论如下:
相关问题:DirectX 9.0 3D游戏开发编程基础 读后感
答:DirectX 9.0 3D游戏开发编程基础 内容提要: 本书主要介绍如何使用DirectX 9.0开发交互式3D图形程序,重点是游戏开发。全书首先介绍了必要的数学工具,然后讲解了相关的3D概念。其他主题几乎涵盖了Direct3D中的所有基本运算,例如图元的绘制、光... >>详细
相关问题:谁有《DirectX 9.0 3D游戏开发编程基础》这本书上...
答:代码的网站已经改了,www.d3dcoder.net 上去就知道了 找不到我再给你发吧 >>详细
相关问题:directx 9.0 3D游戏开发编程基础
答:我来啊 我 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
