游戏开发基础(一)

 

第一章
Direct3D是一套底层(low-level)图形API(Application Programming Interface,应用程序编程接口)
HAL是一个指示设备完成某些操作的设备相关的代码集
REF设备,它能以软件运算方式完全支持Direct3DAPI
在程序中,HAL设备用值D3DDEVTYPE_HAL来指定,该值是D3DDEVTYPE枚举类型的一个成员,类似,REF设备值用D3DDEVTYPE_REF来指定,该值也是D3DDEVTYPE的成员
表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。( 实际上像素数据存储在一个线性数组中)
表面的宽度和高度都用像素来度量,跨度则用字节来度量,更具体的说,跨度可能比宽度更宽,这依赖底层的硬件实现,所以不能简单的假设pitch= width* sizeof(pixelForamt)

我们用IDirect3DSurface9来描述表面
接口IDirect3DSurface9中最重要的方法如下:
LockRect 该方法用于获取指向表面存储区的指针,通过指针运算,可对表面中的每一个像素进行读写操作
UnlockRect 该方法以解除对表面存储区的锁定
GetDesc该方法通过填充结构D3DSURFACE_DESC来获取该表面的描述信息
例:锁定表面存储区以及将每个像素设为红色
D3DSURFACE_DESC surfaceDesc;
_surface->GetDesc(&surfaceDesc);

D3DLOCKED_RECT lockedRect;
_surface->LockRect(
     &lockedRect,
     0,
     0);
DWORD *imageData = (DWORD*) lockedRect.pBits;//将bits强制转换为32位的DWORD类型
for (int i =0 ;i< surfaceDesc.Height;i++)
for (int j = 0; j< surfaceDesc.Width;j++)
{
      int index = i * lockedRect.Pitch/4 + j;
      imagedata[index] = 0xffff0000;//red
}
_surface->UnlockRect();
结构D3DLOCKED_RECT定义如下
typedef struct _D3DLOCKED_RECT{
 INT   Pitch;
 void* pBits;
}D3DLOCKED_RECT;

多重采样用于平滑块状图像技术
D3DMULTISSAMPLE_TYPE枚举类型包含了一系列枚举常量值
*D3DMULTISSAMPLE_NONE禁止多重采样
*D3DMULTISSAMPLE_1_SAMPLE....D3DMULTISSAMPLE_16_SAMPLE指定从1~16级的多重采样
还有一个与特定多重采样类型相关的质量水平(quality level),该水平值用DWORD类型描述
如果使用多重采样,请用IDirect3D9::CheckDeviceMultiSampleType方法来检查你的图形设备是否支持你所希望采用的多重采用类型,并验证得到的图形质量水平是否理想
像素格式可用D3DFORMAT枚举类型的枚举常量来定义
表面和其他的Direct3D资源可以放入许多类型的内存池中,内存池的类型可用D3DPOOL枚举类型来表示
*D3DPOOL_DEFAULT默认值,指示Direct3D将资源放入最合适该资源类型及其使用方式的存储区中,该存储区可能是显存,AGP,系统存储区
注意,调用IDirect3DDevice9::Reset前,必须对默认内存池中的资源销毁或释放,还必须对内存池中的资源重现初始化
*D3DPOOL_MANAGE 放入该托管内存池中的资源将交由Direct3D管理(这些资源将根据需要被设备自动转移到显存或AGP存储区中),此外,这些资源将在系统存储区中保留一个备份,这样必要时Direct3D会将这些资源自动更新到显存中
*D3DPOOL_SYSTEMMEM将资源放入系统存储区中
*D3DPOOL_SCRATCH将资源放入系统存储区中,不同前述类型
*D3DPOOL_SYSTEMMEM这些资源不受图形设备的制约,设备无法访问该类型内存中的资源,但这些资源之间可以复制
Direct3D维护着一个表面集合,该集合通常由两到三个表面组成,称为交换链,该集合用IDirect3DSwapChain9来表示
交换链和页面置换技术主要用于生成更加平滑的动画。
深度缓存是一个只含有特定像素的深度信息而不含图像数据的表面。
深度缓存为最终绘制的图像中的每一个像素都保留一个深度项。所以绘制的图像的分辨率为640*480时,深度缓存中将有640*480个深度项

深度缓存格式:
*D3DFMT_D32 //32位深度缓存
*D3DFMT_D24S8//24位深度缓存,其中8位保留供模板缓存使用
*D3DFMT_D24X8//仅指定24位深度缓存
*D3DFMT_X4S4//24位深度缓存,其中4位保留供模板缓存使用
*D3DFMT_D16//16位深度缓存

两种不同方式的顶点运算,软件顶点运算,硬件顶点运算

 

Direct3D所提供的每一项性能都对应于结构D3DCAP9中的一个数据成员或某一位
我们以某一具体硬件为基础,可以初始化一个D3DCAPS9类型的实例,然后在应用程序中通过检查该D3DCAPS9实例中相应的数据成员或位来判断该设备是否支持某项特性

例:检查某一硬件设备是否可作硬件顶点运算(即检验该设备是否支持变换和光照的硬件计算)
通过查阅D3DCAPS9的相关SDK文档,发现数据成员D3DCAPS9::DevCaps的D3DDEVCAPS_HWTRANSFORMANDLIGHT位可用来表示该设备是否支持变换和光照的硬件计算。

 bool supportsHardwareVertexProcessing = false;
 if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
  supportsHardwareVertexProcessing = true;
Direct3D初始化:
(1) 获取接口IDirect3D9指针,该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,该接口是一个c++对象,代表我们用来显示3D图形的物理硬件设备
(2)检查设备性能(D3DCAPS9),判断主显卡是否支持硬件顶点运算
(3)初始化D3DPRESENT_PARAMETERS结构的一个实例,我们可以通过该结构来指定即将创建的接口IDirect3DDevice9的特性
(4)利用D3DPRESENT_PARAMETERS结构创建IDirect3DDevice9对象

 


获取接口IDirect3D9的指针
IDirect3D9* _d3d9;
_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);//函数Direct3DCreate9的参数必须是D3D_SDK_VERSION,只有如此方能保证应用程序使用正确的头文件。

IDirect3D9 对象主要有两个用途:设备枚举以及创建IDirect3DDevice9类型的对象
设备枚举指获取系统中可用的每块图形卡的性能,显示模式,格式及其他信息
校验硬件顶点运算:
要进行检查,必须先根据主显卡的性能参数初始化一个IDirect3DDevice9类型的对象,
HRESULT IDirect3D9::GetDeviceCaps(
    UINT Adapter,//物理显卡序号
    D3DDEVTYPE DeviceType,//设备类型(D3DDEVTYPE_HAL/D3DDEVTYPE_REF)
    D3DCAPS9 *pCaps//初始化的设备性能结构实例
    );

例:
 D3DCAPS9 caps;
 d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,deviceType,&caps);
 int vp = 0;
 if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
  vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
 else
  vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  

D3DPRESENT_PARAMETER结构:
typedef struct _D3DPRESENT_PARAMETERS_{
 UINT      BackBufferWidth;//后台缓存中表面的宽度,单位为像素
 UINT      BackBufferHeight;//后台缓存中表面的宽度,单位为像素
 D3DFORMAT BackBufferFormat;//后台缓存的像素格式(如32位像素格式:D3DFMT_A8R8G8B8).
 UINT      BackBufferCount;//所需后台缓存的个数,通常指定为1
 D3DMULTISAMPLE_TYPE MultiSampleType;//后台缓存使用的多重采样类型
 DWORD     MultiSampleQuality;//多重采样质量水平
 D3DSWAPEFFECT SwapEffect;//D3DSWAPEFFECT枚举类型的一个成员,指定交换链中的缓存页面置换方式指定D3DSWAPEFFECT_DISCARD时效率最高
 HWND      hDeviceWindow;//设备相关的窗口句柄
 BOOL      Windowed;//true窗口模式,false全屏模式
 BOOL      EnableAutoDepthStencil;//true表示Direct3D自动创建并维护深度缓存或模式缓存
 D3DFORMAT AutoDepthStencilFormat;//深度缓存或模板缓存的像素格式
 DWORD     Flags;//一些附加特性 0无标记,D3DPRESENTFLAG_LOCKABLE_DEPTHBUFFER 可锁定后台缓存
 UINT      FullScreen_RefreshRateInHz;//刷新频率 默认:D3DPRESENT_RATE_DEFAULT
 UINT      PresentationInterval;//D3DPRESENT集合的一个成员,D3DPRESENT_INTERVAL_IMMEDIATE立即提交,D3DPRESENT_INTERVAL_DEFAULT 有Direct3D来选择提交频率,通常该值等于刷新频率
}D3DPRESENT_PARAMETERS;

 

创建IDirect3DDevice9类型的对象:
HRESULT IDirect3D9::CreateDevice(
    UINT Adapter, //哪块物理显卡
    D3DDEVTYPE DeviceType,//设备类型 ,D3DDEVTYPE_HAL
    HWND hFocusWindow,//与设备相关的窗口句柄
    DWORD BehaviorFlags,//D3DCREATE_HARDWARE_VERTEXPROCESSING或D3DCREATE_SOFTWARE_VERTEXPROCESSING
    D3DPRESENT_PARAMETERS *pPresentationParameters,//已经完成的初始化D3DPRESENT_PARAMETERS类型的实例
    IDirect3DDevice8** ppReturnedDeviceInterface//返回所创建的设备
    );


例:
 IDirect3DDevice9* device = 0;
 hr = d3d9->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    hwnd,
    D3DCREATE_HARDWARE_VERTEXPROCESSING,
    &d3dpp,
    &device);
 if (FAILED(hr))
 {
   return 0;
 }

你可能感兴趣的:(游戏,struct,存储,Parameters,图形,Direct3D)