第二讲 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
下一讲预告
基本图元和颜色





posted @ 2013-06-08 19:22  jadeshu  阅读(209)  评论(0编辑  收藏  举报