Direct3D 的初始化分解为如下步骤:
1 获取接口 IDrirect3D8的指针。
2 检查设备性能(D3DCAPS9), 判断主显(primaty display adapter or primaty graphics card)卡是否支持硬件顶点运算.
3 初始化 D3DPRESENT PARAMETERS 结构的一个实例。
4 利用已初始化的D3DPRESENT PARAMETER 结构创建IDirect3DDevice9对象(一个C++对象)。
获取接口IDirect3D9的指针
要初始化IDirect3D,首先必须获取指向接口IDirect3D9的指针。 如下:
IDirect3D9 *_d3d9;
_d3d9 = Direct3DCreate9 (D3d_SDK_VERSION);
参数一定是D3d_SDK_VERSION。才保证应用程序用用头文件。
IDirect3D9对象的两个用途:
a 设备枚举(device enumeration)
指获取系统中可用的每块图形卡的性能、显示模式 格式及其他信息。
b 创建IDirect3DDevice9类型的对象
校验硬件顶点运算
要进行检查,必有先根据主显卡的性能参数初始化一个IDirect3DDevice9类型的对象 用如下方法:
HRESULT IDirect3D9::GrtDeviceCaps (
UINT Adapter, //指定物理显卡的序号
D3DDEVTYPE DevicType, //指定设备类型(例如硬件设备(EVTYPE_HAL)
//软件设备(D3DDEV_TYPE_REF)).
D3DCAPS9 * pCaps //返回已的设备性能结构实例。
);
填充D3DPRESENT_PARAMENTER结构
typedef struct _D3DPRESUNT_PARAMETERS_{
UINT BackBufferWidth;
UINT BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT FresentatioInterval;
} D3DPRESENT_PATAMETERS;
说明:
BackBufferWidth 后台缓存中表面的宽度, 单位为像素。
BackBufferHeight 后台缓存中表面的宽度, 单位为像素。
BackBufferFormat 后台缓存的像素格式 (如32位 D3DFMT_A8R8G8GB8)
BackBufferCount 所需使用的后台缓存的个数, 通常指定为1。只要一个
MultiSampleType 后台缓存所用的多重采样类型。
MultiSampleQuality 多重采样的质量水平。
SwapEffect WAPEFFERCTST枚举类型的一个成员。该枚举类型指定了交换链中的缓存在页面转换方式。指定D3DSWAPEFFECT_
ISCARD时效率最高。
hDeviceWindow 与设备相关的窗口句柄 了所要进行绘制的应用程序窗口
Windowed 为true时 表示窗口模式 为false时表示全屏模式。
EnableAutoDepthStencil 设为true 则Direct3D自动创建并维护尝试缓存或模板缓存。
AutoDepthStencilFormat 尝试缓存或模板缓存的像素格式(例如,用24位表示深度并将8位保留供模板缓存使用, D3DFMT_D24S8).
Flags 一些附加的特性。
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //pixel format
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;
D3DPRESENT_PARAMETERS 结构填充完毕之后, 我们可用如下方法创建
IDirect3DDevice9 类型对象
HRESULT IDirect3D9::CreateDvevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags
D3DPRESINT_PARAMETERS *pPresentationParemeters,
IDirect3DDevice9** ppReturnedDeviceInterface
);
说明:
Adapter 指定我们希望自己创建的IDirect3DDevice9 对象体表哪块物理显卡。
DeviceType 指定需要使用的设备类型(如 硬件设备D3DDEVTYPE_HAL或软件设备D3DDEVTYPE_REF).
hFocusWindow 设备相关的窗口句柄。通常情况下是指设备所要进行绘投影的目标窗口。为了达到预期的目的。句柄与D3DPRESENT_PARAMETERS 结构的数据成员 d3dpp.hDeviceWindow。
BchavirFlags该参数可为D3DCREATE_HARDWARE_VERTEXPROCESSINGA
或D3DCREATE_SOFTWARE_VERTEPROCESSING.
pPresentationParameters 一个已经完成初始化的D3DPRESENT_PARAMETERS类型的实例,该实例定义了设备的一些特性。
ppReturnedDeviceInterface 返回所创建的设备。
if( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, //primary adpater
deviceType, //device type
hwnd, //window associated with device
vp, // 可以是D3DCREATE_HARDWARE_VERTEXPROCESSING
//D3DCREATE_SOFTWARE_VERTEXPROCESSING
&d3dpp, //present parameters
device); //returned created device
if( FAILED(hr) )
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
}
《DirectX 9.0 3D游戏开发编程基础》笔记
原文链接: https://www.cnblogs.com/fangshenghui/archive/2010/04/06/1705759.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/9683
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!