前言:
应几个网友的要求,利用工作之余,写了一篇DirectX 3D(简称D3D)编程入门教程。该教程适用于一些刚刚涉及D3D编程的朋友,读者必须有一定的C++ 和Win32的编程知识。对一些大虾级的高手,这只能使班门弄斧了,同时也非常欢迎爱好D3D编程的朋友和我联系和交流,并提出宝贵意见。
该教程基于DirectX 8.0 Graphics, 一部分内容由DirectX 8.0 SDK 英文文档翻译而来,一部分是自己工作经验的总结,作者对此享有著作权,读者可任意拷贝和传播,但不包含商业的用途,转贴请注明出处。
一, D3D对象 ( D3D Object)
主要讲述以下几方面的内容:
1.关于D3D对象
微软Direct3D时基于COM的对象和接口的,Direct3D编程的第一步必须建立这个对象。而且程序结束后, 你必须最后释放该对象。
2.建立D3D对象
在DirectX8.0中,你可以用如下代码建立一个D3D对象:
#include // 必须包含的头文件
#include
LPDIRECT3D8 g_lpD3D = NULL; // D3D对象指针,以后经常用到
if( NULL == (g_lpD3D=Direct3Dcreate8(D3D_SDK_VERSION) ) ) // D3D_SDK_VERSION确保该对象建立正确的头文件上,目前只能用该值。
return E_FAIL;
二, D3D设备 ( D3D Device )
主要讲述以下几方面的内容:
1.什么是D3D设备?
一个D3D设备接口可以简单的认为是本机一块显卡的抽象,它包含了显卡所有的硬件参数及状态值,比如 说,显卡显存的数量和起始的线性地址,是否支持深度缓冲(Depth Buffer),雾化(Fog),纹理(Texture) 及MipMap等。
2.D3D设备的功能
在D3D编程中,一个D3D设备接口主要能完成以下的功能模块:
a. 转换功能(Transformation): 主要完成对3D 模型数据的转换,例如,世界转换( World transformation),视转换(View transformation),投影转换(Projection transformation)。
b. 灯光照明功能: 完成对场景的灯光渲染,例如,设置环境光,方向光等。
c. 光栅化显示功能: 根据设置的一些3D状态参数和当前屏幕显示模式以及剪切等情况,将3D图形在屏幕 上显示出来。
3.D3D设备的类型
在DirectX 8.0中,支持三种类型的D3D设备:硬件抽象层设备,参比设备,软件模拟设备,每一种设备可 以认为是一种独立的3D驱动程序,但也各有用途和优势,下面详细说明。
a. 硬件抽象层设备 ( HAL Device):D3D中最主要的设备类型,基于显卡的硬件功能,具有很快的3D硬件 加速功能,能执行硬件或软件的顶点数据处理。缺点是必须有3D显卡支持( 如果你没有足够的钱买好 的显卡的话,也只能望洋兴叹了),而且,并不是每种显卡都支持所有的3D功能,所以在使用该设备 时,必须经常查询显卡支持的功能,对不支持的用软件设备来模拟。
b. 软件模拟设备(Software Device): 顾名思义,是用软件的方法来模拟3D的一些功能。依赖于一些特 殊的CPU指令集( 比如,AMD 3D-Now, Intel MMX指令集), 软件模拟设备也能获得较高的3D性能。而 且软件模拟设备具有硬件抽象层设备一样的函数接口,使用方便。缺点是大量占用CPU资源,运行速度 较慢,只适合同硬件抽象层设备配合使用。
c. 参比设备(Reference Device):是微软Direct3D支持的一种附加设别类型,它也依赖于特殊的CPU指令 集,但同软件模拟设备相比,它更注重模拟的精确性,而不是速度方面。所以它一般应用于对3D硬件 的测试和硬件功能的演示上。
4.建立D3D设备
在DirectX 8.0中,建立一个D3D设备需要到用IDirect3D8 接口中的CreateDevice函数,该函数原型如下
HRESULT CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,
IDirect3DDevice8** ppReturnedDeviceInterface
);
函数参数说明可以查询DirectX 8.0 SDK 的文档,不过是英文的,下面给出一段代码说明:
// 该段代码建立一个基于Window窗口程序的D3D硬件抽象层设备,采用软件的顶点数据处理,并使用16Bits 的深度缓冲区。
D3DDISPLAYMODE d3ddm;
HRESULT hr = 0;
hr = g_pD3D-GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
if( FAILED(hr) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 指明是窗口模式,而非全局独占模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 无需交换链
d3dpp.BackBufferFormat = d3ddm.Format; // 后备缓冲区颜色格式
d3dpp.EnableAutoDepthStencil = TRUE; // 使深度缓冲区有效
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲区颜色格式
// Create the D3D Device
hr = g_pD3D-CreateDevice(
D3DADAPTER_DEFAULT, // 使用当前显卡作注设备
D3DDEVTYPE_HEL, // 设备类型
hWnd, // 该程序所在的窗口句柄
D3DCREATE_SOFTWARE_VERTEXPROCESSING, // 用软件的方法处理顶点数据
&d3dpp, // 指向上面的结构
&g_pd3dDevice ) ) ) // 指向3D设备的指针
if( FAILED(hr) )
{
return E_FAIL;
}
该节内容讲完了,如果看完后你觉得头晕眼花,不知所云的话,也是很正常的,因为有好多的3D图形概念我们还没有提及到,在以下的章节里,我回一一为大家介绍。