Direct Graphics的初始化

    在Direct7.0之前,绘图引擎分成DirectDraw与Direct3D,而Direct8.0则针对游戏3D化而将DirectDraw与Direct3D合并,取名为Direct Graphics,专门用来处理绘图影像以及利

用3D命令的硬件加速特性来发展更强大的API函数。
    首先,要建立一个Direct Graphics环境,先要规划一个程序框架,可以定义一个类,来存放所有与之有关的东东。
    首先,我们要创建界面来源和主要设备,先在类成员中加上
    LPDIRECTD9 d3d_3D;
    LPDIRECT3DDEVICE9 d3d_Device;
    前者作为其他Direct Graphics界面的来源,而后者则是通知硬件做影像处理的主要设备,因此他们的初始化是相当重要的。

    我们先来看看d3d_3D的初始化工作。以下就是创建用的函数:
    IDirect3D9 * Direct3DCreate9(
       UINT SDKVersion
    );
    一般,应把创建过程写成d3d_3D = Direct3DCreate9(D3D_SDK_VERSION);它的参数没有其他特别的作用,只是为了保证头文件的版本与动态联结库中的相匹配。

    再来看看d3d_Device的初始化过程,首先,我们先来了解两个结构,定义如下:
    (1)typedef struct D3DDISPLAYMODE {
            UINT Width;  //屏幕宽度
            UINT Height; //屏幕高度
            UINT RefreshRate;  //屏幕刷新率
            D3DFORMAT Format;  //用来表述当前层的显示模式版本
         }D3DDISPLAYMODE, *LPD3DDISPLAYMODE;
     我们可以通过d3d_3D的GetAdapterDisplayMode方法来获取(具体参数见帮助),它在创建主设备时会用到。
    (2)typedef struct D3DPRESENT_PARAMETERS {
             UINT BackBufferWidth, BackBufferHeight;//后备缓冲交换链的高度与宽度,以像素为单位(有两种情况,注意看帮助)
             D3DFORMAT BackBufferFormat;            //必须是一个证实有效的渲染对象的格式,(具体见帮助,注意可以获取D3DDISPLAYMODE来定义)
             UINT BackBufferCount;                  //后备缓冲的数量
             D3DMULTISAMPLE_TYPE MultiSampleType;   //Multisampling is supported only if the swap effect is D3DSWAPEFFECT_DISCARD
             DWORD MultiSampleQuality;              //质量等级
             D3DSWAPEFFECT SwapEffect;              //用来定义后备缓冲交换链的方式
             HWND hDeviceWindow;                    //窗体句柄,可以看作当前活动的窗口
             BOOL Windowed;                         //是否全屏幕
             BOOL EnableAutoDepthStencil;           //是否用多个缓冲链
             D3DFORMAT AutoDepthStencilFormat;      //缓冲链的格式
             DWORD Flags;                           //
             UINT FullScreen_RefreshRateInHz;
             UINT PresentationInterval;
         } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;
         我们需要直接对它进行设置,是作为创建主设备的输入参数而存在的,它定义了表现用的一系列参数。
    
      接下来我们看看如何创建主设备,假设我们要创建的设备是一个窗口程序,使用缓冲链,且可以锁定缓冲区进行绘图操作,创建方式如下:
      D3DDISPLAYMODE d3ddm;
      if(d3d_3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) != D3D_OK)
          return 0;

      D3DPRESENT_PARAMETERS d3dpp;
      memset(&d3dpp, 0 ,sizeof(d3dpp));
      d3dpp.Windowed = Iswindow;
      d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
      d3dpp.BackBufferFormat = d3ddm.Format;
      d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
      d3dpp.EnableAutoDepthStencil = TRUE;
      d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
      if(this->d3d_3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
          hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3d_Device) != D3D_OK)
          return 0;

      到这里,Direct Graphics的初始化工作就算告一段落了。


 

你可能感兴趣的:(框架,struct,Parameters,化工,引擎,Direct3D)