Direct3D初始化
一、Direct3D初始化预备知识
1. 表面
表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。其组成部分如下图:
表面的宽度(width)和高度(height)都用像素来度量。跨度(pitch)则用字节来度量。代码中我们用接口 IDirect3DSurface9(一种COM类)来描述表面。接口IDirect3DSurface9最重要的方法如下:
1) LockRect 用于获取指向表面存储区的指针。通过指针运算,可对每一个像素进行操作。
2) UnlockRect 如果调用了LockRect方法,而且已经执行完访问表面存储区的操作,必须调用该方法解除对表面存储区的锁定。
3) GetDesc 该方法可以通过填充结构D3DSURFACE_DESC来获取表面的描述信息。
如下代码提供了锁定表面存储区以及将每个像素设为红色的代码段的代码:
// 假设 _surface是指向IDirect3DSurface9接口的指针
// 假设每个像素点是32位像素格式
// 获取表面描述信息
D3DSURFACE_DESC surfaceDesc;
_surface->GetDesc(&surfaceDesc);
// 获取指向表面像素数据的指针
D3DLOCKED_DESC lockedRect;
_surface->LockRect(
&lockedRect, //获取锁定数据的指针
0, //锁定整个表面
0); //无特定锁定标志
// 设置每个像素为红色
DWORD *imagedata = (DOWRD *) lockedRect.pBits;
for(int i=0;iUnlockRect();
其中,D3DLOCKED_RECT的定义如下
typedef struct _D3DLOCKED_RECT{
INT Pitch; //表面跨度
void *pBits; //指开表面存储区开始指针
}D3DLOCKED_RECT;
2. 多重采样
用像素矩阵表示图像时往往会出现块状效应,多重采样是用于平滑块状图像的技术。采样有多种采样级别,用D3DMULTISAMPLE_TYPE枚举类型表示,这些值包括
D3DMULTISAMPLE_NONE 禁止多重采样
D3DMULTISAMPLE_1_SAMPLE...D3DUTISAMPLE_16_SAMPLE 1~16级多重采样
多重采样会大大降低程序运行速度。使用该技术前,需要用IDirect3D9::CheckDeviceMultiSampleType方法来检查图形设备是否支持所希望采用多重采用类型。
3. 像素格式
创建表面和纹理(texture)需要指定这些Direct3D资源的像素格式。像素格式用D3DFORMAT枚举类型常量来表示。下面是常见格式。
D3DFMT_R8G8B8,D3DFMT_X9R9G9B9,D3DFMT_A8R8G8B8...
4. 内存池
表面和其他Direct3D资源可以放入许多类型的内存池中。内存类型用D3DPOOL枚举类型表示。可用内存池包括D3DPOOL_DEFAULT, D3DPOOL_MANAGE等。
5. 交换链和页面置换
Direct3D维护一个表面集合,该集合通常由两到三个表面组成,称为交换链(Swap Chain)。该集合用接口IDirect3DSwapChain9来表示。交换链和页面置换技术(Page Flipping)主要用于生成更加平滑的动画。
6. 深度缓存
深度缓存(depth buffer)是只含有一个特定像素的深度信息而不含有图像数据的表面。深度缓存为最终绘制的图像中每一个像素都保存了一个深度项(entry)。
7. 顶点运算
顶点是3D几何学中的基本元素。在Direct3D中,可用两种不同的方式进行顶点运算(Vertex Processing),即软件顶点运算和硬件顶点运算。
8. 设备性能
Direct3D所提供的每一项性能都对应于结构D3DCAPS9中的一个数据成员或某一位。我们的想法是,首先某一具体硬件为基础,初始化一个D3DCAPS9类型的实例,然后在应用程序中通过检查该D3DCAPS9实例相应的数据成员或者位来判断设备是否支持某项特性。例如我们发现数据成员 D3DCAPS9::DevCaps 的D3DDEVCAPS_ HWTRANSFORMANDELIGHT位可用来表示该设备是否支持变换和光照的硬件计算。
Direct3D初始化的知识到这里就结束了。下面开始正式地讲解Direct3D的初始化(附代码)。
二、Direct3D初始化
初始化Direct3D大致步骤如下:
1. 获取接口 IDirect3D9 的指针。该接口用于获取系统中物理硬件设备的信息并创建接口 IDirect3DDevice9 该接口是一个C++对象,代表我们用来显示3D图形的物理硬件设备。
2. 检查设备性能(D3DCAPS9),判断主显卡是否支持顶点运算。为了创建IDirect3DDevice9,必须明确显卡是否支持该功能。
3. 初始化 D3DPRESENT_PARAMETERS 结构的一个实例。该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性。
4. 利用已经初始化的D3DPRESENT_PARAMETER结构创建IDirect3DDevice9对象(一个C++对象,代表了我们用来显示3D图形的物理硬件设备)。
#ifndef __d3dUtilityH__
#define __d3dUtilityH__
#include
#include
namespace d3d
{
bool InitD3D( //初始化DirectX3D
HINSTANCE hInstance, // [in] Application instance.
int width, int height, // [in] Backbuffer dimensions.
bool windowed, // [in] Windowed (true)or full screen (false).
D3DDEVTYPE deviceType, // [in] HAL or REF
IDirect3DDevice9** device);// [out]The created device.
int EnterMsgLoop( //消息循环
bool (*ptr_display)(float timeDelta));
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
template void Release(T t)
{
if( t )
{
t->Release();
t = 0;
}
}
template void Delete(T t)
{
if( t )
{
delete t;
t = 0;
}
}
}
#endif // __d3dUtilityH__
详细的Direct3D初始化在下篇文章。给出连接http://blog.csdn.net/chenwu_843402773/article/details/8077935。
————Josh 2012年10月14日