1.1Direct3D概述
Direct3D是一套底层图形API借助这个API,能够利用硬件加速功能来绘制3D场景。Direct3D可以被视作应用程序和图形设备(3D硬件)交互的中介。
Direct3D和图形设备之间有一个中间环节-HAL(硬件抽象层)。设备制造商将其产品所支持的全部功能全部实现到HAL中,那些Direct3D支持但是设备不支持的
功能无法在HAL中实现。
1.1.1 REF设备
当Direct3D提供的某些功能不为图形设备支持,希望用这些功能。Direct3D提供了参考光栅设备
1.2COM(组件对象模型)
COM是一项能够让DirectX独立于编程语言并且具备向下兼容的技术。常称COM对象为接口,可以认为是一个C++类。我们所知道就是如何通过
某个特定函数或者另一COM接口的方法获取指向某一COM接口的指针。不能用C++的new和delete来创建释放。应该调用Release方法(所有COM接口
的功能继承自COM接口IUnknown这个接口提供了Release)
COM接口又一个前缀I例如表面surface的COM接口为IDirect3DSurface9;
1.3预备知识
1.3.1表面。
表面是Direct3D主要用于存储2D图像数据的一个像素矩阵
用接口IDirect3DSurface9来描述表面。
LockRect用于获取指向表面存储区的指针,通过指针运算可以对表面的每一个像素进行读写
UnLockRect调用了上一个方法,并且执行完访问表面存储区的操作,用来解除对表面存储区的锁定
GetDesct 填充结构D3DSURFACE_DESC来获取该表面的描述信息
//讲解锁定表面存储区以及将每个像素设定为红色的代码段。
#include <d3d9.h>
#include <d3dx9.h>
VOID test(){
IDirect3DSurface9*pSurface;//指向表面的指针
D3DSURFACE_DESC surfaceDesc;//表面结构体
pSurface->GetDesc(&surfaceDesc);
//获取一个指向表面存储区的指针
D3DLOCKED_RECT lockedRect;
pSurface->LockRect(&lockedRect,0,0);
//遍历珍格格像素在表面上的并设置为红色
DWORD* imageData = (DWORD*)lockedRect.pBits;
for (int i=0;i<surfaceDesc.Height;++i)
{
for (int j=0;j<surfaceDesc.Width;++j)
{
//跨度为4个字节每个DWORD
int index = i*lockedRect.Pitch/4+j;//索引第几个像素的红色
imageData[index] = 0xffff0000;//red
}
}
pSurface->UnlockRect();
}
1.3.2多重采样
用像素矩阵表示图形的时候会出现块状效应,多重采样用于平滑块状图像的技术。
D3DMULTISAMPLE_TYPE枚举类型包含了一系列枚举常量值。
D3DMULTISAMPLE_NONE 禁用多重采样
D3DXMULTISAMPLE_1_SAMPLE...D3DMULTISAMPLE_16_SAMPLE指定从1-16级的多重采样
另外还有一个与特定多重采样类型相关的质量水平,用DWORD类型描述
1.3.3像素格式
创建表面或者纹理的时候常常需要指定资源的像素格式。
D3DFORMAT枚举类型定义
D3DFMT_R8G8B8 每个像素24位从左端开始8位红色8位绿色,8位蓝色。
D3DFMT_X8R8G8B8 32位组成 8位未使用其他类似上面
1.3.4内存池
内存池的类型可用D3DPOOL枚举
D3DPOOL_DEFAULT 默认值,该类型的内存池指示了Direct3D将资源放入最适合该资源类型以及使用方法的存储区。
可能是显存,AGP存储区或者系统存储区。调用IDirect3DDevice9::Reset值钱必须对默认内存池的资源销毁或者释放
D3DPOOL_MANAGE 放入该托管内存池中的资源交由Direct3D管理(就是资源将根据需要被设备自动转移到显存或者AGP存储区中)而且
资源会在系统存储区中一个备份,必要时候会自动更新打显存
D3DPOOL_SYSTEMMEM 资源放入系统存储区
D3DPOOL_SCRATCH 指定该资源放入系统存储区,这些资源不受图形设备的制约。设备无法访问这个类型内存池的资源,但是资源之间可以复制。
1.3.5交换链和页面置换
Direct3D维护着一个表面集合,这个集合通常有两道3个表面组成,称为交换链。用IDirect3DSwapChain9表示,几乎不用对其操作
位于前台缓存槽中的表面对应于当前显示器中的图像。显示器并不是立即显示前台缓存表示的图像。应用程序的帧频经常与显示器的刷新频率不同步。直到当前帧在显示器中显示完毕,才将前台缓存中的内容更新为下一帧。我们不想停止对应用程序的绘制所以我们将下一帧在后台缓存中绘制。当前台缓存中的内容显示完毕,我们将其置换到交换链的末端,并将交换链的下一个后台缓存提升到前台缓存中。
1.3.6深度缓存
深度缓存是一个只含有特定像素深度信息而不是含有图像数据的表面。深度缓存为最终绘制的图像的每一个像素保留一个深度项。
深度测试的基本内容是根据深度值让处于同一位置的不同像素进行竞争,选出写入该位置的像素,距离摄像机距离近的像素获胜,并写入深度缓存的位置。
深度缓存的格式巨鼎了深度测试的精度,24位的深度缓存要比16为深度缓存精确。
D3DFMT_D32 :32位深度缓存。
D3DFMT_D24S8:指定24位深度缓存,其中8为保留模板缓存
D3DFMT_X4S4;指定24位深度缓存,4位保留功模板缓存使用
1.3.7顶点运算
顶点是3D几何学的基本元素,Direct3D中用两种方式进行顶点运算 硬件顶点运算或者软件顶点运算。无论任何配置的硬件
软件顶点运算总被支持。而硬件顶点运算只有得到图形卡的支持方可使用。
我们应该优先考虑硬件顶点方式,因为硬件有专门的加速功能。程序运算速度快而且不占用CPU资源,CPU可以进行其他运算。
1.3.8设备性能
Direct3D提供的每项性能对应结构D3DCAP9中的一个数据成员或者一位。初始化一个D3DCAPS9实例,通过检查相应的数据成员
或者位来判断设备是否支持特性。
bool supportsHardwareVertexProcessing;
if(caps.DevCaps&D3DDEVCAPS)HWRIANSFORMANDLIGHT){
supportsHardwareVertexProcessing = true;
}
else{
supportsHardwareVertexProcessing = false;
}