1.1-Direct3D概述
应用程序通过Direct3D库来访问HAL(Hardware Abstraction Layer),通过HAL(硬件抽象层)来控制图形设备(显卡等)
HAL设备用Direct3D中的宏D3DDEVTYPE_HAL来指定
1.1.1-REF设备
有时Direct3D提供的某些功能不被图形设备支持,那么可以用REF(reference rasterizer device,光栅设备),它能以软件运算方式完全支持Direct3D API.
通过光栅设备,可以在代码中使用那些不为硬件所支持的特性,并对这些特性进行测试.
REF设备用Direct3D中的宏D3DDEVTYPE_REF来指定
我自己测试过用软件运算来渲染,效率真的很慢...
1.2-COM(组件对象模型)
COM(Component Object Model,组件对象模型)是一项能够使DirectX独立于编程语言并具备向下兼容的技术.
我们常称COM对象为接口,可以将其视为一个C++类来使用.
1.3-图形学基础知识
1.3.1 表面
表面是Direct3D用于存储2D图像数据的一个像素矩阵,可以用接口IDirect3DSurface9来描述表面
//GetDesc-该方法通过填充接口D3DSURFACE_DESC来获取该表面的描述信息
D3DSURFACE_DESC surfaceDesc;
_surface->GetDesc(&surfaceDesc);
//LockRect-该方法用于获取指向表面存储区(surface memory)的指针,通过指针运算,可对表面中的每一个像素进行读写操作
D3DLOCKED_RECT lockedRect;
_surface->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++){
int index=i*lockedRect.Pitch/4+j;
imagedata[index]=0xffff0000; //red
}
}
//UnlockRect-如果调用了LockRect,就必须调用该方法解除对表面存储区的锁定
_surface->UnlockRect();
1.3.2 多重采样
用像素矩阵表示图像会出现块状(blocky-looking)效应,多重采样(multisampling)便是一项用于平滑块状图像的技术.
多重采样技术会显著降低应用程序的运行速度,可以用IDirect3D9::CheckDeviceMultiSampleType()来检查图形设备是否支持
1.3.3 像素格式
创建表面或纹理时,需要指定Direct3D资源的像素格式.像素格式可以用D3DFORMAT枚举类型的枚举常量来定义.
D3DFMT_R8G8B8:每个像素由24位组成,8位红,8位绿,8位蓝
D3DFMT_X8R8G8B8:每个像素由32位组成,8位不使用,8位红,8位绿,8位蓝
D3DFMT_A8R8G8B8:每个像素由32位组成,8位Alpha值,8位红,8位绿,8位蓝
1.3.4 内存池
表面和其他的Direct3D资源可以放入许多类型的内存池(Memory Pool),内存池的类型可用D3DPOOL枚举类型来表示
D3DPOOL_DEFAULT:默认值,由Direct3D自动调配.在调用IDirect3DDevice9::Reset之前,必须对内存池中的资源进行销毁和释放
D3DPOOL_MANAGE:放入由Direct3D管理的显存或AGP存储区
D3DPOOL_SYSTEMMEM:系统存储区
D3DPOOL_SCRATCH:系统存储区,不受图形设备制约
1.3.5 交换链和页面置换
Direct3D维护着一个表面集合(Collection),该集合由两到三个表面组成,称为交换链(Swap Chain),该集合用接口IDirect3DSwapChain9来表示.
交换链和页面置换技术(Page Flipping)主要用于生成更加平滑的动画,拥有前台缓存槽(front buffer slot)和离屏表面(后台缓存)
1.3.6 深度缓存
深度缓存(depth buffer)是一个只含有特定像素的深度新而不含图像数据的表面.深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项(entry).
Direct3D为了判定某一个物体的哪些像素位于另一个物体之前,使用深度缓存(depth buffering)或z-缓存(z-buffering)的技术
D3DFMT_D32:指定32位深度缓存
D3DFMT_D24S8:指定24位深度缓存,其中8位保留供模板缓存来使用
D3DFMT_D24X8:仅指定24位深度缓存
D3DFMT_X4S4:指定24位深度缓存,其中4位保留供模板缓存使用
D3DFMT_D16:仅指定16位深度缓存
1.3.7 设备性能
Direct3D所提供的每一项性能都能对应于结构D3DCAP9中的一个数据成员或某一位.
//检验图形设备是否支持硬件运算
bool supportsHardwareVertexProcessing;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
supportsHardwareVertexProcessing=true;
}else{
hardwareSupportsVertexProcessing=false;
}