设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记之二――最简单的DirectX,vc窗口的编写(二)
2014-11-23 20:17:43 】 浏览:931
Tags:Visual 游戏 开发 笔记 之二 简单 DirectX 窗口 编写
于显示器。对此,可以调用GetDisplayAdapter()函数获取显示模式。最后一个变量PresentationInterval处理可以显示的交换链的后台缓存的最大次数。交换链主要让程序有多个窗口在桌面上同时显示(每个渲染自己的窗口)本书不涉及交换链的讨论,所以这里将不使用该变量。程序清单1.3 InitializeD3D()函数中调用的最后一个函数是CreateDevice()。该函数主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形。如果函数失败,最后一个参数(对象被发送给ppReturnedDeviceInterface)将为NULL(空)。测试函数是否失败的另一种方法是判断函数的返回值是否是D3D_OK以外的其他值。如果不是D3D_OK,则意味着创建过程中出现了问题,而且不会按照给定的规格创建设备。下面的代码给出了CreateDevice()的函数原型。

CreateDevice()函数原型代码如下:

[cpp]
HRESULT CreateDevice( UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9 **ppReturnedDeviceInterface
);

CreateDevice()函数中的第一个参数是Adapter。该参数用于指定正在使用的显卡。第二个参数DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。
下一参数hFocusWindow也是一个窗口句柄。参数BehaviorFlags是标识符组合,用于指定设备的运行方式。

pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构。ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。

一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。代码1.6给出了验证这个过程的例子代码。例子代码创建简单的显示空白黑屏的函数。

在屏幕上绘制一个空白屏的代码:


[cpp]
void RenderScene()
{
// Clear the backbuffer.
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
// Begin the scene. Start rendering.
g_D3DDevice->BeginScene();
// End the scene. Stop rendering.
g_D3DDevice->EndScene();
// Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}


RenderScene()函数开始先清除后台缓存。调用Direct3D设备对象的Clear()函数可以完成该工作。Clear()函数的参数包括:要清除的矩形数目(0代表清除整个屏幕)、定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)、标识要清除内容的标识符、清除后的颜色、要设定的深度值、设定模板缓存值。对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存。后面将会更多地介绍深度缓存。

一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。由于这里只是绘制了一个空白窗口,所以在BeginScene()和EndScene()之间不需要添加任何代码。

最后一步是在屏幕上显示渲染结果。调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。第二个参数是一个指针,它指向要渲染的最终矩形。第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。Present()函数中的最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。

既然可以使用Direct3D初始化和渲染屏幕,那么剩下要做的工作是在退出程序时,释放对象。在Direct3D中,会发现通常要在退出程序前释放系统使用的内存,从而避免内存泄漏。所有要释放的内存都可以通过调用对象的Release()函数释放。Release()函数会减少对象的引用计数。如果引用计数降为0,那么系统就可以安全地从内存中删除对象。如果对单个对象有多个引用,那么必须牢记对所有的对象都要调用Release()函数,否则将不会释放内存。要牢记的规则就是:如果创建了对象,那么最终就要释放该对象。下述代码给出了在一个名为Shutdown()的函数中释放两个Direct3D对象的方法。

释放所有的Direct3D对象的代码

[cpp]
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
g_D3DDevice = NULL;
g_D3D = NULL;
}

到这里,基本的模块都已经一目了然了,下面我们把他串联起来,构成一个整体。
完整的Blank Window演示程序代码如下:

[cpp]
#include
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#define WINDO

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目