第二讲 DX9简单框架程序实例
内容
•实现基本过程
•函数讲解
Direct3DCreate9 创建Direct3D接口对象
CreateDevice 创建Direct3D设备接口
Clear 清除后台缓存
BeginScene 开始绘制Direct3D图形
EndScene 结束绘制Direct3D图形
Present 翻转----》通过交换链形式
•实例
编辑:jadeshu
实现基本过程
函数Direct3DCreate9讲解
1.创建Direct3D接口对象
IDirect3D9 * Direct3DCreate9( UINT SDKVersion); //版本号
通过Direct3D中的Direct3DCreate9函数返回指向IDirect3D9接口的指针,此时需要传递给函数一个表示Direct3D版本信息的D3D_SDK_VERSION参数。例如:
LPDIRECT3D9 pD3D = NULL;
pD3D = Direct3DCreate9( D3D_SDK_VERSION );
D3D_SDK_VERSION参数表示当前使用的DirectX SDK版本,用于确保应用程序所有包含的头文件在编译时能够与DirectX运行时的DLL相匹配。
2.创建Direct3D设备接口
HRESULT CreateDevice(
[in] UINT Adapter, //接口对象所代表的显卡类型。
[in] D3DDEVTYPE DeviceType, //设备类型
[in] HWND hFocusWindow, //窗口句柄
[in] DWORD BehaviorFlags, //指定了Direct3D设备进行3D运算的方式
[in, out] D3DPRESENT_PARAMETERS *pPresentationParameters,//参数
[out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface
//返回设备接口指针
);
函数CreateDevice讲解
在创建IDirect3DDevice9接口对象之前,需要准备一个D3DPRESENT_PARAMETERS结构类型的参数,用于说明如何创建Direct3D设备。该结构体的定义如下:
typedef struct _D3DPRESENT_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 PresentationInterval; //翻转模式
} D3DPRESENT_PARAMETERS;
•BackBufferWidth、BackBufferHeight和BackBufferCount字段指定后台缓冲区的宽度、高度和数量。
•l BackBufferFormat字段指定了后台缓冲区保存像素的格式,它可以用D3DFORMAT枚举定义。常用的像素格式及说明如表2.2所示。
像素格式
|
说 明
|
D3DFMT_UNKNOWN
|
未知的像素格式
|
D3DFMT_R8G8B8
|
24位色表示方式,即每个像素的RGB值各占8位
|
D3DFMT_A8R8G8B8
|
32位色,在24位的基础上添加8位表示透明程度
|
D3DFMT_X8R8G8B8
|
32位色,在24位的基础上添加了8位保留位
|
D3DFMT_R5G6B5
|
16位色,R占5位,G占6位,B占5位
|
D3DFMT_X1R5G5B5
|
16位色,RGB各占5位,添加了一位保留位
|
D3DFMT_A1R5G5B5
|
16位色,RGB各占5位,添加了一位表示半透明
|
D3DFMT_A4R4G4B4
|
16位色,RGBA各占4位
|
D3DFMT_R3G3B2
|
8位色,R占3位,G占3位,B占2位
|
D3DFMT_A8
|
只用8位表示半透明
|
D3DFMT_A8R3G3B2
|
16位色,R占3位,G占3位,B占2位,A占8位
|
D3DFMT_A8P8
|
16位色,8位代表半透明,8位颜色索引值代表颜色
|
D3DFMT_P8
|
8位色,用颜色索引值表示D3DFMT_L88位色,只表示亮度
|
D3DFMT_L16
|
16位色,只表示亮度
|
•l MultiSampleType和MultiSampleQuality成员指定了多重采样的类型及格式。
•l SwapEffect成员指定Direct3D如何将后台缓冲区的内容复制到前台的缓存中。
•l hDeviceWindow成员用于指定绘制图形的窗口句柄,为NULL时表示使用当前被激活的窗口。
•l EnableAutoDepthStencil成员表示Direct3D是否为应用程序自动管理深度缓存。
•l FullScreen_RefreshRateInHz成员表示当全屏模式时指定屏幕的刷新率。
•l Flags成员用于表示附加属性,通常可以设为0;而PresentationInterval成员用于指定平面的翻转模式,在窗口模式下,其取值为0。
Clear函数
3.Direct3D的绘制过程就是:绘制→显示→绘制→显示。但是,每当开始绘制图形之前,都需要通过IDirect3DDevice9接口的Clear方法将后台缓存中的内容进行清空,并设置表面的填充颜色等。该方法的声明如下:
HRESULT IDirect3DDevice9::Clear
(
DWORD Count, //矩形个数
const D3DRECT *pRects, //矩形数组指针
DWORD Flags, //标志
D3DCOLOR Color, //颜色填充
float Z, //Z深度
DWORD Stencil //模板 可选
);
•l pRects参数用于指定对表面指定的矩形区域进行清除操作,数组中包含的矩形的数量由Count参数指定。
•l Flags参数指定了需要清除的表面,该参数可以取值于D3DCLEAR_TARGET、D3DCLEAR_ZBUFFER和D3DCLEAR_STENCIL,分别表示对后台缓存、深度缓存和模板缓存进行清除。
•l Color参数用于指定在清除缓存内容后设置的背景色,可以通过D3DCOLOR_XRGB宏将RGB值转换给该参数。
•l Z参数用于指定当清除缓存内容后设置深度缓存的值。
BeginScene和EndScene函数
•4.开始绘制Direct3D图形
HRESULT BeginScene();
•5.结束绘制Direct3D图形
HRESULT EndScene();
Present函数
•6.翻转----》通过交换链形式
HRESULT Present(
[in] const RECT *pSourceRect, //源矩形
[in] const RECT *pDestRect, //目矩形
[in] HWND hDestWindowOverride,
[in] const RGNDATA *pDirtyRegion,
);
•l pSourceRect和pDestRect参数分别表示复制的源矩形和目的矩形区域。
•l hDestWindowOverride表示Direct3D设备接口的窗口句柄,而pDirtyRegin表示最小更新域。
交换链
•Direct3D使用了一种称为交换链(Page Flipping)的技术让画面平滑地过渡。交换链由两个或两个以上的表面组成,而每个表面都是用于存储2D图形数据的一个线性数组,其中的每个元素都表示屏幕上的一个像素。
•绘制完成后,两者进行交换链的页翻动的工作,把处理完的图形显示出来,如图所示。
资源下载点击打开链接
结束语
•本讲回顾
创建设备过程 渲染过程
•
• jadeshu
•下一讲预告
–基本图元和颜色