在Direct7.0之前,绘图引擎分成DirectDraw与Direct3D,而Direct8.0则针对游戏3D化而将DirectDraw与Direct3D合并,取名为Direct Graphics,专门用来处理绘图影像以及利
用3D命令的硬件加速特性来发展更强大的API函数。
首先,要建立一个Direct Graphics环境,先要规划一个程序框架,可以定义一个类,来存放所有与之有关的东东。
首先,我们要创建界面来源和主要设备,先在类成员中加上
LPDIRECTD9 d3d_3D;
LPDIRECT3DDEVICE9 d3d_Device;
前者作为其他Direct Graphics界面的来源,而后者则是通知硬件做影像处理的主要设备,因此他们的初始化是相当重要的。
我们先来看看d3d_3D的初始化工作。以下就是创建用的函数:
IDirect3D9 * Direct3DCreate9(
UINT SDKVersion
);
一般,应把创建过程写成d3d_3D = Direct3DCreate9(D3D_SDK_VERSION);它的参数没有其他特别的作用,只是为了保证头文件的版本与动态联结库中的相匹配。
再来看看d3d_Device的初始化过程,首先,我们先来了解两个结构,定义如下:
(1)typedef struct D3DDISPLAYMODE {
UINT Width; //屏幕宽度
UINT Height; //屏幕高度
UINT RefreshRate; //屏幕刷新率
D3DFORMAT Format; //用来表述当前层的显示模式版本
}D3DDISPLAYMODE, *LPD3DDISPLAYMODE;
我们可以通过d3d_3D的GetAdapterDisplayMode方法来获取(具体参数见帮助),它在创建主设备时会用到。
(2)typedef struct D3DPRESENT_PARAMETERS {
UINT BackBufferWidth, BackBufferHeight;//后备缓冲交换链的高度与宽度,以像素为单位(有两种情况,注意看帮助)
D3DFORMAT BackBufferFormat; //必须是一个证实有效的渲染对象的格式,(具体见帮助,注意可以获取D3DDISPLAYMODE来定义)
UINT BackBufferCount; //后备缓冲的数量
D3DMULTISAMPLE_TYPE MultiSampleType; //Multisampling is supported only if the swap effect is D3DSWAPEFFECT_DISCARD
DWORD MultiSampleQuality; //质量等级
D3DSWAPEFFECT SwapEffect; //用来定义后备缓冲交换链的方式
HWND hDeviceWindow; //窗体句柄,可以看作当前活动的窗口
BOOL Windowed; //是否全屏幕
BOOL EnableAutoDepthStencil; //是否用多个缓冲链
D3DFORMAT AutoDepthStencilFormat; //缓冲链的格式
DWORD Flags; //
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;
我们需要直接对它进行设置,是作为创建主设备的输入参数而存在的,它定义了表现用的一系列参数。
接下来我们看看如何创建主设备,假设我们要创建的设备是一个窗口程序,使用缓冲链,且可以锁定缓冲区进行绘图操作,创建方式如下:
D3DDISPLAYMODE d3ddm;
if(d3d_3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) != D3D_OK)
return 0;
D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0 ,sizeof(d3dpp));
d3dpp.Windowed = Iswindow;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
if(this->d3d_3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3d_Device) != D3D_OK)
return 0;
到这里,Direct Graphics的初始化工作就算告一段落了。