DirectX Graphics 入门

来源:互联网 发布:海岛奇兵烟雾升级数据 编辑:程序博客网 时间:2024/05/18 18:42

Direct3D组件

使用D3D组件要包含D3D9.h头文件

主要的D3D组件有

IDrect3D9 该对象可以收集图形的硬件信息及其接口

IDrect3DDevice9 该对象可以渲染图形,处理图形图像资源,创建和设置渲染状态等

IDrect3DVertexBuffer9 包含一个用于渲染多边形顶点数组的信息

IDirect3DTexture9 存储所有的面着色图像

 

初始化系统

1.        获取一个Direct3D接口

2.        选择一个显示模式

3.        设置显示模式

4.        创建设备接口并初始化显示接口

 

获取一个Direct3D接口

LPDIRECT3D9 g_pD3D = NULL;    //Direct3D对象

 

//创建Direct3D对象, 该对象用于创建Direct3D设备对象

if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )

      return E_FAIL;

 

选择显示模式

显示模式通过分辨率,色深,及其默认刷新率来区分显示模式,显示模式的信息储存在D3DDISPLAYMODE结构体中

 

typedef struct_D3DDISPLAYMODE{

         UNIT         Width;

         UNIT         Height;

         UNIT         RefreshRate;

         D3DFORMAT   Format;     //颜色格式

}       D3DDISPLAYMODE

 

可以如下设置

D3DDISPLAYMODE d3ddm;

d3ddm.Width = 640;

d3ddm.Height = 480;

d3ddm.RefreshRate = 0;        //默认刷新率

d3ddm.Format = D3DFMT_R5G6B5;

 

D3DFMT_R8G8D8                       //24位,8红8绿8蓝

D3DFMT_A8R8G8B8

D3DFMT_X8R8G8B8

D3DFMT_R5G5B5

D3DFMT_X1R5G5B5                            //1位,未使用

D3DFMT_A1R5G5B5                            //1位,Alpha

 

//g_pD3D 与初始化的Direct3D对象

//d3df 与初始化的D3DFORMAT结构体

//检测是否存在该显示模式

 

if(FAILED(g_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DEVTYPE_HAL,&d3df,&d3df,FALSE)))

//出现错误不支持该模式

 

//返回一个有效的D3DDISPLAYMODE结构体存储在d3ddm中

if(FAILED(g_pD3D->GetDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))

    return FALSE;

 

设置显示模式

 

确定如何将图形显示给玩家。是在一个窗口中显示,还是全屏显示或者在后备缓冲区中操作?使用何种刷新率?所有信息都存储在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;

不必全部理会其中的字段,根据是窗口还是全部显示,下面是会用到的两种可能的设置

//d3ddm 与初始化D3DDISPLAYMODE结构体

D3DDISPLAYMODE_PARAMETERS d3dpp;

 

//清空结构体

ZeroMemory(&d3dpp,sizeof(D3DDISPLAYMODE_PARAMETERS));

 

//对于窗口模式

d3dpp.Windowed = TRUE;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = d3ddm.Format      //使用相同的演示模式

 

//对于全屏使用

d3dpp.Windowed = FALSE;

d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;

d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

d3dpp.BackBufferFormat = d3ddm.Format;

 

//对于窗口和全屏指定宽度与高度

d3dpp.BackBufferWidth = Width;

d3dpp.BackBufferHeight = Hegith;

 

创建设备接口并初始化显示接口

HRESULT CreateDevice(      
     UINT Adapter,                                                                 //D3DADAPTER_DEFAULT

     D3DDEVTYPE DeviceType,                                 //D3DDEVTYPE_HAL

     HWND hFocusWindow,                                        //窗口句柄用于渲染

     DWORD BehaviorFlags,                                        //D3DCREATE_SOFTWARE_VERTEXPROCESSING

     D3DPRESENT_PARAMETERS *pPresentationParameters,                     //d3dpp

     IDirect3DDevice9** ppReturnedDeviceInterface                                        //设备对象

);

调用方法如下

IDirect3DDevice8 *g_pD3DDevice = NULL;

if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd,

                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                  &d3dpp, &g_pD3DDevice)))

 

注HAL(hardware abstraction layer)硬件抽象层 REF(reference device)参考设备 HAL是真实的显卡 REF通过软件方式实现显卡不支持的功能

 

丢失设备

如何知道设备丢失!?通过检测设备的返回值,如果设备对象返回D3DERR_DEVICELOST值,就知道设备已经丢失。重新获得设备控制权是一步到位的。

HRESULT IDirect3DDevice9::Reset( D3DPRESENT_PARAMETERS *pPresentationParameters);

 

g_pD3DDevice->Reset(&d3dpp);

原创粉丝点击