Direct3D初始化代码含义

 

// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    //创建Direct3D对象, 该对象用来创建Direct3D设备对象
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    //创建Direct3D设备对象
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

   return S_OK;
}

HRESULT :函数返回值。如果这个函数是执行完返回的话将包含具有实际意义的数据,如果立即返回则包含状态信息--发送成功与否,并不能说明执行的如何。

HRESULT 是一种简单的数据类型,通常被属性和 ATL 用作返回值。下表说明各种不同的值。头文件 winerror.h 中包含更多的值。
名称 说明 值
S_OK 操作成功 0x00000000
E_UNEXPECTED 意外的失败 0x8000FFFF
E_NOTIMPL 未实现 0x80004001
E_OUTOFMEMORY 未能分配所需的内存 0x8007000E
E_INVALIDARG 一个或多个参数无效 0x80070057
E_NOINTERFACE 不支持此接口 0x80004002
E_POINTER 无效指针 0x80004003
E_HANDLE 无效句柄 0x80070006
E_ABORT 操作已中止 0x80004004
E_FAIL 未指定的失败 0x80004005
E_ACCESSDENIED 一般的访问被拒绝错误 0x80070005
不能简单地把返回值与 S_OK 和 S_FAIL 比较,而要用 SUCCEEDED 和 FAILED 进行判断。(以上内容参照百度百科)
 
 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;
关键词是D3D_SDK_VERSION,它被定义在SDK的头文件中。在Direct3D被初始化时,D3D_SDK_VERSION作为参数传递给函数Direct3DCreate9(),并与DirectX的版本号比较,若比较不匹配则初始化将失败。这保证了系统能够创建适当的代码并正常运行,这个值本身并没有什么特别的含意,它仅仅只是个比较值。
 
D3DPRESENT_PARAMETERS结构
在创建Direct3D设备之前,还需要先初始化D3DPRESENT_PARAMETERS结构,该结构用于创建Direct3D设备对象。该结构定义了Direct3D设备对象的相关信息,而这些信息将会影响Direct3D设备的显示方法。该结构定义如下:

  struct D3DPRESENT_PARAMETERS{

   UINT BackBufferWidth;//指定后台缓冲区的宽度

   UINT BackBufferHeight;//指定后台缓冲区高度

   D3DFORMAT BackBufferFormat;//指定后台缓冲区的像素格式,设置为D3DFMT_UNKNOWN时,后台缓冲区与当前显卡的显示像素格式相同

   UINT BackBufferCount;//指定后台缓冲区的数量。该值可以为0、1、2、3,其中0和1时都表示创建一个后台缓冲区

   D3DMULTISAMPLE_TYPE MultiSampleType;//指定多重采样类型,用于图形反锯齿

   DWORD MultiSampleQuality;

   D3DSWAPEFFECT SwapEffect;//指定系统如何将后台缓冲区的内容复制到前台缓冲区,该成员是D3DSWAPEFFECT枚举类型

   HWND hDeviceWindow;//指定图形绘制窗口

   BOOL Windowed;//标识图形以窗口方式还全屏方式显示

   BOOL EnableAutoDepthStencil;//如果要使用Z缓冲,则把它设为TRUE

   D3DFORMAT AutoDepthStencilFormat;//如果不使用深度缓冲,那么这个参数将没有用。如果启动了深度缓冲,那么这个参数将为深度缓冲设定缓冲格式

   DWORD Flags;//可以设置为0或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER

   UINT FullScreen_RefreshRateInHz;//指定显示适配器刷新屏幕的速率。以窗口显示设置为0;以全屏显示,取IDirect3D9::EnumAdapterModes()返回值

   UINT PresentationInterval;//指定后台缓存与前天缓存的最大交换频率

  };

 

ZeroMemory(PVOID Destination,SIZE_T Length)函数:ZeroMemory宏用0来填充一块内存区域。参数有两个,

Destination :指向一块准备用0来填充的内存区域的开始地址。
Length :准备用0来填充的内存区域的大小,按字节来计算。
 
 
CreateDevice()其包含参数按顺序:
UINT Adapter,//指定显卡序号通常设置为D3DADAPTER_DEFAULT
D3DDEVTYPE DeviceType,//指定Derect3D设备类型
HWND hFocusWindow,//指定当Direct3D程序从前台变换到后台时的提示窗口
DWORD BehaviorFlag,//指定Direct3D设备进行3D运算的工作方式
D3DPRESENT_PARAMETERS* pPresentationParameters,//指向结构体D3DPRESENT_PARAMETERS
IDirect3DDevice**  ppReturnedDeviceInterface//CreateDirect()函数将返回的Direct3D设备对象指针地址存储在它的最后一个参数ppReturnedDeviceInterface中
 
 
参考:1.http://blog.sina.com.cn/s/blog_4a0a14170100f48y.html
2.http://blog.csdn.net/warmtrue/article/details/4632330
3.《精通DirectX 3D图形与动画程序设计》

posted on 2014-12-01 15:53  西瓜皮小队  阅读(456)  评论(0编辑  收藏  举报

导航