• Direct初始化三步曲


    一.初始化


    1.IDirect3D9,
    IDirect3D9几个定义
       typedef struct IDirect3D9 *LPDIRECT3D9, *PDIRECT3D9;


    用途:
    此接口主要是IDirect3DDevice9创建的前提,主要是对IDirect3DDevice设置参数


    创建IDirect3D9对象
    IDirect3D9 * Direct3DCreate9(
      UINT SDKVersion
    );

    2.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, *LPD3DPRESENT_PARAMETERS;

    参数说明:

    BackBufferWidth和BackBufferHeight:后备缓冲的宽度和高度。在全屏模式下,这两者的值必需符合显卡所支持的分辨率。例如(800,600),(640,480)。

    BackBufferFormat:后备缓冲的格式。这个参数是一个D3DFORMAT枚举类型,它的值有很多种,例如D3DFMT_R5G6B5、D3DFMT_X8R8G8B8为游戏后备缓冲常用格式,这说明后备缓冲的格式是每个像素16位,其实红色(R)占5位,绿色(G)占6位,蓝色(B)占5位,为什么绿色会多一位呢?据说是因为人的眼睛对绿色比较敏感。DX9只支持16位和32位的后备缓冲格式,24位并不支持。如果对这D3DFORMAT不熟悉的话,可以把它设为D3DFMT_UNKNOWN,这时候它将使用桌面的格式。

    BackBufferCount:后备缓冲的数目,范围是从0到3,如果为0,那就当成1来处理。大多数情况我们只使用一个后备缓冲。使用多个后备缓冲可以使画面很流畅,但是却会造成输入设备响应过慢,还会消耗很多内存。

    MultiSampleType和MultiSampleQuality:前者指的是全屏抗锯齿的类型,后者指的是全屏抗锯齿的质量等级。这两个参数可以使你的渲染场景变得更好看,但是却消耗你很多内存资源,而且,并不是所有的显卡都支持这两者的所设定的功能的。在这里我们分别把它们设为D3DMULTISAMPLE_NONE和0。


    可以通过CheckDeviceMultiSampleType 来检测当前装置是否支持某个抗锯齿类型
    typedef enum _D3DMULTISAMPLE_TYPE
    {
        D3DMULTISAMPLE_NONE               =  0,
        D3DMULTISAMPLE_2_SAMPLES       =  2,
        D3DMULTISAMPLE_3_SAMPLES       =  3,
        D3DMULTISAMPLE_4_SAMPLES       =  4,
        D3DMULTISAMPLE_5_SAMPLES       =  5,
        D3DMULTISAMPLE_6_SAMPLES       =  6,
        D3DMULTISAMPLE_7_SAMPLES       =  7,
        D3DMULTISAMPLE_8_SAMPLES       =  8,
        D3DMULTISAMPLE_9_SAMPLES       =  9,
        D3DMULTISAMPLE_10_SAMPLES      = 10,
        D3DMULTISAMPLE_11_SAMPLES      = 11,
        D3DMULTISAMPLE_12_SAMPLES      = 12,
        D3DMULTISAMPLE_13_SAMPLES      = 13,
        D3DMULTISAMPLE_14_SAMPLES      = 14,
        D3DMULTISAMPLE_15_SAMPLES      = 15,
        D3DMULTISAMPLE_16_SAMPLES      = 16,
        D3DMULTISAMPLE_FORCE_DWORD     = 0x7fffffff
    } D3DMULTISAMPLE_TYPE;

    //type 为以上的枚举值
    D3DMULTISAMPLE_TYPE type;
    int quality; //获取相对于type的最大质量等级(设置type抗拒值类型时,设置的质量等级只能小于这个数)
    //m_d3dBackFmt 为后备缓冲格式,m_bWindowed 是否为窗口模式,
    m_pD3D9->CheckDeviceMultiSampleType( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,m_d3dBackFmt, m_bWindowed,type,&quality );

    SwapEffect:交换缓冲支持的效果类型,指定表面在交换链中是如何被交换的。它是D3DSWAPEFFECT枚举类型,可以设定为以下三者之一:D3DSWAPEFFECT_DISCARD,D3DSWAPEFFECT_FLIP,D3DSWAPEFFECT_COPY。

    如果设定为D3DSWAPEFFECT_DISCARD,则后备缓冲区的东西被复制到屏幕上后,后备缓冲区的东西就没有什么用了,可以丢弃(discard 是否丢弃由显卡决定,但不再等待)了。
    如果设定为D3DSWAPEFFECT_FLIP,后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲大于1个时使用设定D3DSWAPEFFECT_COPY的话, 后备缓冲拷贝到前台缓冲,保持后备缓冲内容不变。当后备缓冲等于1个时使用一般我们是把这个参数设为D3DSWAPEFFECT_DISCARD。如果想使用GetBackBuffer 获得后备缓冲内容打印屏幕画面。则不能使用DISCARD.很怀疑用DISCARD效率会好的说法。在我的8600GT 上_COPY 明显好于DISCARD. discard 做法是再次使用后备缓冲时 new 一个新的缓冲,旧的缓冲内容遗弃,如果还有使用旧的缓冲地方,不会影响新的内容,如使用抗锯齿必须是DISCARD。这样不用等待硬件同步。不过大部分是一次Present操作。用COPY在新机器上面反倒效率好些。毕竟new 一个 1440*900 的后台缓冲也是有消耗的。(对于DISCARD 做法仅仅是猜测。不同显卡可能不同。)

    hDeviceWindow:显示设备输出窗口的句柄

    Windowed:如果为FALSE,表示要渲染全屏。如果为TRUE,表示要渲染窗口。渲染全屏的时候,BackBufferWidth和BackBufferHeight的值就得符合显示模式中所设定的值。

    EnableAutoDepthStencil:如果要使用Z缓冲或模板缓冲,则把它设为TRUE。
    AutoDepthStencilFormat:如果不使用深度缓冲,那么这个参数将没有用。如果启动了深度缓冲,那么这个参数将为深度缓冲设定缓冲格式。常用值D3DFMT_24S8 (24 深度缓冲,8模板缓冲),D3DFMT_24X8(24 深度缓冲),D3DFMT_16(16深度缓冲)等等。

    //深度缓存和模板缓存的象素格式,如 D3DFMT_D24S8 , 24 位表示深度,8位为模板缓存。一般不会用到32位深度:D3DFMT_32
    //注意如果设置模板缓冲在Clear() 函数中也要清楚模板缓冲:设置参数 D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL

    Flags:通常为0 或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用来做什么的,看字面好像是一个能否锁定后备缓冲区的标记。

    D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL 丢弃模板缓冲区

    FullScreen_RefreshRateInHz:显示器的刷新率,单位是HZ,如果设定了一个显示器不支持的刷新率,将会不能创建设备或发出警告信息。为了方便,一般设为D3DPRESENT_RATE_DEFAULT就行了。

    PresentationInterval:如果设置为D3DPRENSENT_INTERVAL_DEFAULT,则说明在显示一个渲染画面的时候必要等候显示器刷新完一次屏幕。例如你的显示器刷新率设为80HZ的话,则一秒内你最多可以显示80个渲染画面。另外你也可以设置在显示器刷新一次屏幕的时间内显示1到4个画面。如果设置为D3DPRENSENT_INTERVAL_IMMEDIATE,则表示可以以实时的方式来显示渲染画面,虽然这样可以提高帧速(FPS),如果速度过快却会产生图像撕裂的情况,但当游戏完成时,帧速度一般不会过快。

    (以上参数说明引自http://topameng.spaces.live.com/blog/cns!F962D4854A8233D!230.entry)

    3.IDirect3DDevice9
    IDirect3DDevice9的几个定义
    typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;

    通过以上参数设置后CreateDevice来创建IDirect3DDevice9的实例
    HRESULT CreateDevice(
      UINT Adapter,
      D3DDEVTYPE DeviceType,
      HWND hFocusWindow,  
      DWORD BehaviorFlags,  
      D3DPRESENT_PARAMETERS * pPresentationParameters,
      IDirect3DDevice9 ** ppReturnedDeviceInterface
    );

    Adapter  指定我们希望用已创建的IDirect3DDevice9对象代表哪块物理显卡。
    DeviceType  指定需要使用的设备类型(如,硬件设备D3DDEVTYPE_HAL或软件设备D3DDEVTYPE_REF)。


    hFocusWindow  与设备相关的窗口句柄。通常情况下是指设备所要进行绘制的目标窗口,为了达到预期的目的,该句柄与D3DPRESENT_PARAMETERS结构的数据成员

    d3dpp.hDeviceWindow应为同一个句柄。


    BehaviorFlags  该参数可为D3DCREATE_HARDWARE_VERTEXPROCESSING或D3DCREATE_SOFTWARE_VERTEXPROCESSING。


    pPresentationParameters  一个已经完成初始化的D3DPRESENT_PARAMETERS类型的实例,该实例定义了设备的一些特性。


    ppReturnedDeviceInterface  返回所创建的设备。

    二.运行


    我们会使用ontime来执行下面的语句来时时刷新和提交

    设定要清理的一些对象的数据
    HRESULT Clear(
      DWORD Count,
      CONST D3DRECT * pRects,
      DWORD Flags,
      D3DCOLOR Color,
      float Z,
      DWORD Stencil
    );

    Count  pRect数组中矩形的数目。


    pRects  所要执行清除操作的屏幕矩形数组。该参数允许我们只对表面的部分区域进行清除操作。


    Flags  指定所要清除的表面。我们可清除下列表面中的一个或多个。D3DCLEAR_TARGET  绘制目标表面,通常指后台缓存。D3DCLEAR_ZBUFFER  深度缓存。

    D3DCLEAR_STENCIL  模板缓存。


    Color  指定将绘制目标体设置为何种颜色。


    Z  深度缓存所要设定的值。


    Stencil  模板缓存所要设定的值。


    提交后台缓存
    HRESULT Present(
      CONST RECT * pSourceRect,
      CONST RECT * pDestRect,
      HWND hDestWindowOverride,
      CONST RGNDATA * pDirtyRegion
    );

    pSourceRect :如果在D3DPRESENT_PARAMETERS中的SwapEffect不是D3DSWAPEFFECT_COPY时设置为NULL

    pDestRect :如果在D3DPRESENT_PARAMETERS中的SwapEffect不是D3DSWAPEFFECT_COPY时设置为NULL


    hDestWindowOverride :NULL是他将会被设置为与D3DPRESENT_PARAMETERS中所设置的hWndDeviceWindow的窗口句柄一样


    pDirtyRegion :如果在D3DPRESENT_PARAMETERS中的SwapEffect不是D3DSWAPEFFECT_COPY时设置为NULL


    三.结束释放
    Release
    释放接口
    IDirect3D9;
    IDirect3DDevice9;


    一些基础知识:
    表面:表面是Direct3D主要用于存储2D图像数据的一个像素矩阵.主要由Pitch(跨度),Width,Height组成,pitch比width宽
    多重采样:是一项用于平滑块状图像的技术,对表面进行多重采样常用于全屏反走样
    像素格式:主要是指定RGB的存储格式
    内存池:表面和其他的Direct3D资源可以放入许多类型的内存池.
    交换链和页面置换:Direct3D维护关一个表面集合,该集合通常由两到三个表面组成,称为交换链swap Chain;
    深度缓存:是一个只含有特定像素的深度信息而不含图像数据的表面.深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项.

  • 相关阅读:
    排序之插入排序
    windows 连接 Linux 云服务器
    【Centos】搭建 SVN 服务器
    【微信小程序】scroll-view 的上拉加载和下拉刷新
    支付宝微信支付
    获取页面所有参数
    .net 比较两个日期大小
    .net json字符串转换为json对象
    .net 3des 解密
    .net xml转json
  • 原文地址:https://www.cnblogs.com/wuyaSama/p/1901510.html
Copyright © 2020-2023  润新知