direct基础学习(二) 最简单的direct3d

来源:互联网 发布:程序员穿着标配 编辑:程序博客网 时间:2024/06/10 15:00

        如果说Windows是一个企业,那么directx是它的一个部门,我们创建一个Windows程序是,需要Windows部门的配合,二directx是一个功能部门,需要使用directx功能时候便需要directx部门参与。

Windows部门以窗口出现我们的程序中,directx也以它的方式参与我们的程序

要使用direct绘图,步骤如下:
1)建立一个direct3d对象
2)建立一个direct3d设备
3)绘图

建立一个direct3d对象
IDirect3D9 *Direct3DCreate9(D3D_SDK_VERSION);
函数将返回一个IDirect3D9指针,失败返回NULL

函数GetAdapterCount,将返回系统的显示卡数量
UINT IDirect3D9::GetAdapterCount(void);
当系统中只有一块显卡的时候它就是主显卡,当有多块是,第一块显卡是主显卡

建立一个IDirect3DDevice9接口
HRESULT CreateDevice(UINT Adapter,
      D3DDEVTYPE DeviceType,
      HWND hFocusWindow,
      DWORD BehaviorFlags,
      D3DPRESENT_PARAMETERS *pPresentationParameters,
      IDirect3DDevice9** ppReturnedDeviceInterface);
我们的游戏程序就是通过这个对象调用显卡工作。正常情况返回D3D_OK(大部分direct函数正确执行都返回这个)
否则就是出现问题:
D3DERR_INVALIDCALL 参数有误
D3DERR_NOTAVAILABLE 设备不支持这个函数
D3DERR_OUTOFVIDEOMEMORY 显存不足
PS:检查返回值判断函数是否成功执行,是一个好习惯
介绍上面6个参数:
Adapter. Type UINT. 显卡号,一般使用D3DADAPTER_DEFAULT,即默认的显卡(第一块)
DeviceType. Type D3DDEVTYPE. 有三种不同的设备类型可以选择:
 D3DDEVTYPE_HAL 硬件加速 (一般使用这个,所以其他不做介绍)
 D3DDEVTYPE_REF
 D3DDEVTYPE_SW
hFocusWindow. Type HWND. IDirect3DDevice9对象所属窗口
BehaviorFlags. Type DWORD. 是一个或者多个D3DCREATE结构,指定设备创建方式。
 后面的例子中将使用D3DCREATE_SOFTWARE_VERTEXPROCESSING
PresentationParamters. Type D3DPRESENT_PARAMETERS. 控制设备显示方式如:全屏与窗口,是否含有缓存等
ppReturnedDeviceInterface. Type IDirect3DDevice9** 这个就不用解释了(在使用中,这里参数用引用)
介绍 D3DPRESENT_PARAMETERS
typedef struct D3DPRESENT_PARAMETERS {
    UINT BackBufferWidth, BackBufferHeight;
    D3DFORMAT BackBufferFormat;  // Type D3DFORMAT. 窗口模式 D3DFMT_UNKNOW使用当前显示模式
    UINT BackBufferCount; // 后备缓存数量
    D3DMULTISAMPLE_TYPE MultiSampleType; // Type D3DMULTISAMPLE_TYPE.  全屏抗锯齿类型,除非指定专门等级否则使用D3DMULTISAMPLE_NONE
    DWORD MultiSampleQuality;  // 抗锯齿等级,传递0除非抗锯齿不可用
    D3DSWAPEFFECT SwapEffect;  // 指定表面在交换链中是如何被交换的,取D3DSWAPEFFECT成员。D3DSWAPEFFECT_DISCARD是最有效的
    HWND hDeviceWindow;  // 从属窗口
    BOOL Windowed;  // 是否窗口化
    BOOL EnableAutoDepthStencil;    // 控制深度反冲,TRUE将自动创建深度/模版缓冲
    D3DFORMAT AutoDepthStencilFormat;  // 深度缓冲格式,Type D3DFORMAT.
    DWORD Flags;  // 一些附加特性,设为0或D3DPRESENTFLAG类型的一个成员
    UINT FullScreen_RefreshRateInHz;  // 屏幕刷新率,设定D3DPRESENT_RATE_DEFAULT使用默认刷新率,窗口模式 0
    UINT PresentationInterval;  // 控制交换速度 D3DPRESENT成员
} D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS;

Clearing the screen
    创建了direct对象,创建了direct设备,接下来就是绘图了嘛?不是,接下来要清屏幕,就像我们创建一个指
针变量以后要给它赋NULL值一样,要给屏幕一个“NULL”
HRESULT Claer(DWORD Count,
     const D3DRECT *pRects,
     DWORD Flags,
     D3DCOLOR Color,
     float Z,
     DWORD Stencil);
Count 将要被清除的矩形个数,当他为0时,pRects必须为NULL;如果不为0则pRects必定指向一个D3DRECT结构数组
知道屏幕上要消除的矩形
Flags 指定缓存是否被清除 D3DCLEAR :
 D3DCLEAR_STENCIL render target
Color D3DCOLOR value containing the color to clear the render target to.  Multiple macros are available
such as D3DCOLOR_XRGB
Z value to store in the depth buffer. ranges from 0.0f to 1.0f
Stencil holds the value to store in the stencil buffer, When the Stencil buffer is not in use, the value is 0
// 有些术语实在不知道怎么翻译-_+!


Displaying the Scene
    在清屏之后,就可以开始绘图了,在Direct3D中使用Present函数来做这些。它执行当缓存到当前页的翻页。
    这里的重点就是在缓存中绘图,然后像屏幕翻页。
HRESULT Present(CONST RECT *pSourceRect,
    CONST RECT *pDestRect,
    HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion);
pSourceRect 一个RECT结构指针,指向缓存中的结构,为NULL的时候表示全部缓存
pDestRect 一个RECT结构指针,指向当前结构
hDestWindowOverride 一个指向窗口的指针,窗口的客户区是当前绘图区。为NULL时候将D3DPRESENT_PARAMETERS的相应成员
pDirtyRegion details the region within the buffer that needs to be updated, NULL to update the whole buffer

Cleaning Up
    收尾工作,释放资源等
    direct是基于COM对象的,结束程序时候要想系统通知释放使用过的对象资源,使用Release函数
   
修改代码
 1)加入D3D头文件,引用D3D lib
 2)在创建窗口后,初始化D3D
 3)用PeekMessage替换原来消息循环中的GetMessage
 4)在消息循环中添加esle分支,当没有消息时,drawing everything to the screen
 while(msg.message != WM_QUIT)
 {
  if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  {
   TranslateMessage( &msg );
   DispatchMessage( &msg );
  }
  else
  {
   Render();
  }
 }
 5)函数结尾处释放资源