Direct3D组件
使用D3D组件要包含D3D9.h头文件
主要的D3D组件有
IDrect3D9 该对象可以收集图形的硬件信息及其接口
IDrect3DDevice9 该对象可以渲染图形,处理图形图像资源,创建和设置渲染状态等
IDrect3DVertexBuffer9 包含一个用于渲染多边形顶点数组的信息
IDirect3DTexture9 存储所有的面着色图像
初始化系统
1. 获取一个Direct3D接口
2. 选择一个显示模式
3. 设置显示模式
4. 创建设备接口并初始化显示接口
获取一个Direct3D接口
LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象
//创建Direct3D对象, 该对象用于创建Direct3D设备对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
选择显示模式
显示模式通过分辨率,色深,及其默认刷新率来区分显示模式,显示模式的信息储存在D3DDISPLAYMODE结构体中
typedef struct_D3DDISPLAYMODE{
UNIT Width;
UNIT Height;
UNIT RefreshRate;
D3DFORMAT Format; //颜色格式
} D3DDISPLAYMODE
可以如下设置
D3DDISPLAYMODE d3ddm;
d3ddm.Width = 640;
d3ddm.Height = 480;
d3ddm.RefreshRate = 0; //默认刷新率
d3ddm.Format = D3DFMT_R5G6B5;
D3DFMT_R8G8D8 //24位,8红8绿8蓝
D3DFMT_A8R8G8B8
D3DFMT_X8R8G8B8
D3DFMT_R5G5B5
D3DFMT_X1R5G5B5 //1位,未使用
D3DFMT_A1R5G5B5 //1位,Alpha
//g_pD3D 与初始化的Direct3D对象
//d3df 与初始化的D3DFORMAT结构体
//检测是否存在该显示模式
if(FAILED(g_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DEVTYPE_HAL,&d3df,&d3df,FALSE)))
//出现错误不支持该模式
//返回一个有效的D3DDISPLAYMODE结构体存储在d3ddm中
if(FAILED(g_pD3D->GetDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
return FALSE;
设置显示模式
确定如何将图形显示给玩家。是在一个窗口中显示,还是全屏显示或者在后备缓冲区中操作?使用何种刷新率?所有信息都存储在D3DPRESENT_PARAMETERS结构体中
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth, 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 PresentationInterval;
} D3DPRESENT_PARAMETERS;
不必全部理会其中的字段,根据是窗口还是全部显示,下面是会用到的两种可能的设置
//d3ddm 与初始化D3DDISPLAYMODE结构体
D3DDISPLAYMODE_PARAMETERS d3dpp;
//清空结构体
ZeroMemory(&d3dpp,sizeof(D3DDISPLAYMODE_PARAMETERS));
//对于窗口模式
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format //使用相同的演示模式
//对于全屏使用
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.BackBufferFormat = d3ddm.Format;
//对于窗口和全屏指定宽度与高度
d3dpp.BackBufferWidth = Width;
d3dpp.BackBufferHeight = Hegith;
创建设备接口并初始化显示接口
HRESULT CreateDevice(
UINT Adapter, //D3DADAPTER_DEFAULT
D3DDEVTYPE DeviceType, //D3DDEVTYPE_HAL
HWND hFocusWindow, //窗口句柄用于渲染
DWORD BehaviorFlags, //D3DCREATE_SOFTWARE_VERTEXPROCESSING
D3DPRESENT_PARAMETERS *pPresentationParameters, //d3dpp
IDirect3DDevice9** ppReturnedDeviceInterface //设备对象
);
调用方法如下
IDirect3DDevice8 *g_pD3DDevice = NULL;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pD3DDevice)))
注HAL(hardware abstraction layer)硬件抽象层 REF(reference device)参考设备 HAL是真实的显卡 REF通过软件方式实现显卡不支持的功能
丢失设备
如何知道设备丢失!?通过检测设备的返回值,如果设备对象返回D3DERR_DEVICELOST值,就知道设备已经丢失。重新获得设备控制权是一步到位的。
HRESULT IDirect3DDevice9::Reset( D3DPRESENT_PARAMETERS *pPresentationParameters);
g_pD3DDevice->Reset(&d3dpp);