zoukankan      html  css  js  c++  java
  • 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;
    深度缓存:是一个只含有特定像素的深度信息而不含图像数据的表面.深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项.

  • 相关阅读:
    再谈TextField
    IOS-TextField知多少
    leftBarButtonItems
    LeftBarButtonItems,定制导航栏返回按钮
    Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法 Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法
    Unrecognized Selector Sent to Instance问题之诱敌深入关门打狗解决办法
    UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
    Present ViewController,模态详解
    UILABEL AUTOLAYOUT自动换行 版本区别
    iOS自动布局解决警告Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
  • 原文地址:https://www.cnblogs.com/wuyaSama/p/1901510.html
Copyright © 2011-2022 走看看