一、D3D简述
由微软公司开发的DirectX,并不是一个单纯的图形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。
D3D即Direct3D是DirectX的三维部分,集成了开发DirectX程序三维图形部分的所有API程序,同时它支持与CUDA的互操作,这样经CUDA并行计算后图像数据可以直接供D3D做显示,这非常适合图形图像系统的研发。
二、D3D程序基本结构
一个D3D程序除去Windows窗口生成和消息传递,主要包含3个步骤:
初始化D3D设备资源--->图形显示设置---->D3D资源设备释放。
1、初始化D3D设备资源
建一个D3D接口:
LPDIRECT3D9 g_pD3D = NULL;
g_pD3D =Direct3DCreate9(D3D_SDK_VERSION);
LPDIRECT3D9的对象是D3D程序的最顶层对象,其它对象都必须通过它的接口函数调用得到。
Direct3DCreate9(D3D_SDK_VERSION)函数就是创建一个当前版本的一个D3D对象并返回接口。
创建D3D设备对象:
D3DPRESENT_PARAMETERS d3dpp; //显示参数
d3dpp.BackBufferWidth = 800; //显示像素x
d3dpp.BackBufferHeight = 600; //显示像素y
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; //32位像素格式
d3dpp.BackBufferCount = 1; //备缓冲表面的数量,通常设为“1”
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //全屏抗锯齿的类型
d3dpp.MultiSampleQuality = 0; //全屏抗锯齿的质量等级
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //指定表面在交换链中是如何被交换的
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = false; //true表示窗口显示,false为全屏显示
d3dpp.EnableAutoDepthStencil = true; //设为true,D3D将自动创建深度/模版缓冲
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // 深度/模版缓冲的格式
d3dpp.Flags = 0; //附加特性,可以设为D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
//深度/模版缓冲在调用IDirect3DDevice9::present方法后将被删除,这有利于提程序性能提升
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //刷新率,设定D3DPRESENT_RATE_DEFAULT使用默认 刷新率
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //PresentationInterval——属于D3DPRESENT成员,又有两个 常用标志,其余请查SDK:
D3DPRESENT_INTERVAL_IMMEDIATE——立即交换
D3DPRESENT_INTERVAL_DEFAULT——D3D选择交换速度,通常等于刷新率
IDirect3DDevice9* device = 0; //d3d设备
hr = g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT, // 指定对象要表示的物理显示设备
D3DDEVTYPE_HAL, // 定设备类型 硬件设备D3DDEVTYPE_HAL,
软件设备D3DDEVTYPE_REF
hwnd, // window associated with device
D3DCREATE_HARDWARE_VERTEXPROCESSING, // 顶点处理类型,硬件处理方式。软件处理方式为
D3DCREATE_SOFTWARE_VERTEXPROCESSING
&d3dpp, // 显示参数
&device);
if( FAILED(hr) )
{
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return 0;
}
2、图形显示
HRESULT IDirect3DDevice9::Clear()函数的作用是在绘制函数前,重置viewport的缓冲区,这是在绘制3D图形前必须调用的
BeginScene()和EndScene()分别为开始和结束渲染,两者必须成对出现,并且不允许嵌套和交错。注意图形渲染的结果是存储在后台缓冲区的。
HRESULT IDirect3DDevice9:: Present()函数是将图形渲染的结果由后台缓冲区复制到前台缓冲区予以显示。
device->Clear(0, 0,
D3DCLEAR_TARGET ,
D3DCOLOR_XRGB(125,0,255), 1.0f,0);
device->BeginScene();
// ........ //添加纹理渲染,图元绘制等函数
device->EndScene();
//将渲染的结果存储到后台缓冲区
//0表示更新所有的缓冲区
device->Present(0, 0, 0, 0);
3、D3D设备资源释放
释放D3D设备资源的方法如下:
if( device ) device->Release();
if(g_pD3D) g_pD3D->Release();
Release()函数会将调用这个设备的DirectX对象的引用计数减1,当DirectX对象的引用计数为0时,它就会释放它所占有的资源。