设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记之二――最简单的DirectX,vc窗口的编写(一)
2014-11-23 20:17:43 】 浏览:929
Tags:Visual 游戏 开发 笔记 之二 简单 DirectX 窗口 编写

笔记一中我们介绍了如何用代码创建空的win32窗口,然而创建空的win32窗口只完成了一半的工作,接下来要做的工作是设置Direct3D,从而可以在屏幕上渲染图形。


Direct3D要调用很多函数才能成功设置API。一旦完成设置,并且设置成功,就可以向屏幕上渲染图形。
下面是函数中设置Direct3D所需的最少代码。


[cpp]
bool InitializeD3D(HWND hWnd, bool fullscreen)
{
D3DDISPLAYMODE displayMode;
// Create the D3D object.
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_D3D == NULL) return false;
// Get the desktop display mode.
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
return false;
// Set up the structure used to create the D3DDevice
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
if(fullscreen)
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferWidth = 640;
d3dpp.BackBufferHeight = 480;
}
else
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = displayMode.Format;
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
{
return false;
}
return true;
}

上段代码中的InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen。窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值。InitializeD3D()函数开始先调用Direct3DCreat9()函数。Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出错。其他步骤很大程度上取决于是否成功调用Direct3DCreat9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。


接下来调用的是GetAdapterDisplayMode()
函数。该函数将返回当前的显示信息,如桌面分辨率(宽度和高度),显示格式,显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。

检索显卡信息之后,函数接下来会创建D3DPRESENT_PARAMETERS对象。D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等。


D3DPRESENT_PARAMETERS结构体的定义:


[cpp]
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth; //窗口宽度
UINT BackBufferHeight; //窗口高度
D3DFORMAT BackBufferFormat; //渲染后台缓存的格式
UINT BackBufferCount; //想要用于渲染的后台缓存总数
D3DMULTISAMPLE_TYPE MultiSampleType;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT FullScreen_PresentationInterval;
} D3DPRESENT_PARAMETERS;


D3DPRESENT_PARAMETERS结构体是的前两个变量是BackBufferWidth( 窗口宽度 ),BackBufferHeight(窗口高度)。接下来的变量BackBufferFormat代表渲染后台缓存的格式。将D3DFMT_DEFAULT发送给该参数,就会得到所要用到的桌面格式。该参数可以接收的其他参数值分别是D3DFMT_A2R10G10B10(红、绿、蓝各10位,Alpha通道2位,总计32位),D3DFMT_A8R8G8B8(红、绿、蓝Alpha各8位,总计32位)、D3DFMT_X8R8G8B8、D3DFMT_AIR5G5B5、D3DFMT_XIR5G5B5和D3DFMT_R5G5B5。

BcakBufferCount是想要用于渲染的后台缓存总数。通常,使用一个后台缓存和一个主缓存,使用多个缓存会使动画更流畅,因为后台缓存上绘制内容,然后将结果复制到主缓存,主缓存将其显示在屏幕上。如果所有的事情都在主缓存处理,那么游戏玩家在玩游戏时,会看到正在刷新的屏幕,从而会产生视觉假象,破坏游
戏的视觉效果。成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果。hDeviceWindow是调用WinMain()中的CreateWindow()函数创建的窗口句柄。Windowed标识符用于指定创建的窗口是否是全屏窗口。
EnableAutoDepthStencil标识符用于设置是否用Direct3D管理缓存深度以及模板缓存。AutoDepthStencilFormat将深度和模板缓存设置为BackBufferFormat可以使用的相同值之一。

结构中的最后三个变量分别是Flags、FullScreen_RefreshRateInHz和PresentationInterval。Flags标识符可以是D3DPRESENTFLAG_DEVICECLIP、D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL和D3DPRESENTFLAG_LOCKABLE_ BUFFER或D3DPRESENTFLAG_VIDEO的任意组合。变量FullScreen_RefreshRateInHz存储显示器的刷新率。对窗口模式程序而言,该值必须为0,但对全屏模式而言,该值取决

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇(Visual C++)游戏开发笔记之五.. 下一篇(Visual C++)游戏开发笔记之六..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目