Direct3D基础——预备知识:多重采样、像素格式、内存池、交换链和页面置换、深度缓存、顶点运算、设备性能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DY_1024/article/details/84103998

多重采样

用像素矩阵表示图像的时候往往会出现块状效应,多重采样便是一项用于平滑块状图像的技术。

图片来自:DirectX9.03D游戏开发编程基础

左边那条是一条锯齿线,右边是一条经过采样的反走样线,看上去要平滑的多。

D3DMULTISAMPLE_TYPE枚举类型包含了一系列枚举常量值,用于表示对表面进行多重采样的级别:

1、D3DMULTISAMPLE_NONE:禁止多重采样

2、D3DMLTISAMPLE_1_SAMPLE    -----    D3DMLTISAMPLE_16_SAMPLE指定了从1~16级的多重采样

另外还有一个与特定多重采样类型相关的质量水平,该水平值用DWORD类型描述。

注意:多重采样技术会显著的降低应用程序运行速度,如果希望使用到多重采样技术,请务使用:IDirect3D9::CheckDeviceMultiSampleType方法来检测本地的图形设备是否支持所使用的多重采样类型,并验证由该类型的多重采样得到的图像质量水平是否理想。

像素格式

创建表面或者纹理时,常常需要指定这些Direct3D资源的像素格式。像素格式可以用D3DFORMAT枚举类型的枚举常量来定义。下面是一些常用格式:

1、D3DFMT_R8G8B8:每个像素由24位组成。自最左端起,8位分配给红色,8位分配给绿色,8位分配给蓝色。

2、D3DFMT_X8R8G8B8:每个像素由于32位组成。自最左端起,8位未使用,8位红色,8位绿色,8位蓝色。

3、D3DFMT_A8R8G8B8每个像素山32位组成。自最左端起,8位分配给Alpha值,8位分配给红色,8位分配给绿色,8位分配给蓝色。

4、D3DFMT_A16B16G16R16F每个像素由64位组成,是一种浮点数类型的像素格式。自最左端起,16位分配给Alpha,16位分配给蓝色,8位分配给绿色,8位分配给红色。

5、D3DFMT_A32B32G32R32F每个像素由128位组成,也是一种浮点数类型的像素格式。自最左端起,32位分配给Alpha,32位分配给蓝色,32位分配给绿色,32位分配给红色。

注意;前面3种格式比较常用,并且为大多数的硬件设备所支持,浮点数的像素格式或者其他的可用格式还没有广泛的额支持,使用之前应该验证硬件设备是否支持。

 内存池

表面和其他Direct3D资源可以放入许多类型的内存池中。内存池的类型可以使用D3DPOOL枚举类型来表示,可用的内存池包括:

·D3DPOOL_DEFAULT 默认值.该类型的内存池指示 Direct3D将资源放入最适合该资源类型及其使用方式的存储区中.该存储区可能是显存(video memory)、AGP存储区或系统存储区.注意,调用函数IDirect3DDevice9::Reset之前,必须对默认内存池中的资源销毁(destroy)
或释放(release).上述函数调用之后,还必须对内存池中的资源重新初始化.
·D3DPOOL_MANAGE放入该托管内存池中的资源将交由Direct3D管理(即,这些资源将根据需要被设备自动转移到显存或AGP存储区中).此外,这些资源将在系统存储区中保留一个备份.这样,必要时Direct3D会将这些资源自动更新到显存中.·D3DPOOL_SYSTEMMEM指定将资源放入系统存储区中.
·D3DPOOL_SCRATCH指定将资源放入系统存储区中.不同于前述类型D3DPOOL_SYSTEMMEM,这些资源不受图形设备的制约.所以,设备无法访问该类型内存池中的资源.但这些资源之间可互相复制.

交换链和页面置换

Direct3D维护着一个表面集合,该集合通常由两三个表面组成,这个表面集合被称为交换链。该集合用接口IDirect3DSwapChain9来表示,具体的实现细节我们可以不关心,它由Direct3D负责管理,目前我们不需要对其进行操作,只对其用途了解就可以。

交换链和页面置换技术只要用于生成更加平滑的图像,下图展示了由两个平面组成的交换链:

图片摘自:DirectX9.03D游戏开发编程基础—P43

上图展示了拥有两个表面的交换链:前台缓存和后台缓存,位于前台缓存的表面对应于在显示器中显示的图像。显示器并不是立即的显示出由前台缓存所表示的图像。例如:当显示器的刷新频率是60HZ的时候,显示一帧图像 需要1/60秒,应用程序的帧频通常与显示器的刷新频率是不同的(例如:应用程序绘制一帧图像的速度可能会快鱼显示器显示一帧的速度),但是只能是把前台缓存的内容显示完毕之后,再能将前台缓存的内容更新为下一帧。但是通常我们在显示器显示前台缓存所表示的图像的时候,并不想停止对于图像的绘制,所以我们将下一个绘制的图像绘制在离屏表面,也就是我们的后台缓存。这样一来,当显示器将前台缓存内容显示完毕之后,我们将其置换到交换链的末端,并将交换链中的下一个后台缓存提升为前台缓存,这个过程称之为提交,下图展示了提交前后的交换链。

上图绘制功能的程序结构:

(1)在后台缓存绘制完成,提交到前台缓存

(2)将前台缓存表示的图像进行显示

(3)显示完成之后,将前台缓存置到交换链的末尾,

(4)再次回到步骤(1)重新开始在执行一遍

深度缓存

深度缓存是一个表面,一个只含有特定像素的深度信息而不含有图像数据的表面。深度缓存为最终绘制的图像中的每一个像素都保留了一个深度项。所以,当所绘制的图像的分辨率为640×480的时候,深度缓存中将有640×480个深度项。

例子(图像为DirectX9.03D游戏开发编程基础—P44):

上图展示了一个简单的场景,其中前面的物体部分遮挡住了位于其后面的物体。Direct3D为了判定某一物体的那些像素位于另一个物体之前,使用了一项叫做:深度缓存的技术

深度缓存用于计算每一个像素的深度值进行深度探测。深度探测的基本内容是让处于同一位置的不同像素进行竞争,以选出该位置到底应该写入哪一个像素。

举例摄影机最近的像素会被写入到深度缓存的位置,这是一种合理的做法,因为举例摄影机近的像素一定会将位于其后方的像素进行遮挡。

深度缓存的格式决定了深度缓存的精度,即:24位的深度缓存会比16位的深度缓存精确的多,虽然Direct3D提供了32位的深度缓存格式,但是通常24位的深度缓存格式已经能够让应用程序获得比较满意的效果。

·D3DFMT_D32指定32位深度缓存。
·D3DFMT_D24S8指定24位深度缓存,其中8位保留供模板缓存(stencil buffer)使用。
·D3DFMT_D24X8仅指定24位深度缓存。
·D3DFMT_X4S4指定24位深度缓存,其中4位保留供模板缓存使用。
·D3DFMT_D16仅指定l6位深度缓存。

顶点运算

顶点是3D几何学中的基本元素,在Direct3D中,有两种不同的顶点运算方式:软件顶点运算方式和硬件顶点运算方式,无论采用何种配置的硬件,软件顶点运算方式都会被支持,但是硬件顶点运算只有得到图形卡的支持方可使用。

实际开发中,我们应该首先考虑硬件顶点运算方式,因为如果使用硬件专有的加速功能,程序的执行速度会比软件的执行速度快很多,而且在硬件顶点运算方式中,可以不占用CPU资源,也就意味着CPU可以解放出来进行其他计算。

注意:图形卡支持硬件顶点运算功能,另一种等价的说法就是:图形卡支持变换和光照的硬件计算。

设备性能

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

下面有一个例子:

假定我们希望检查某一个硬件设备是否可以进行硬件顶点计算,也就是判断该设备是否支持变换和光照的硬件计算。查阅D3DCAPS9的SDK文档,可以发现:数据成员D3DCAPS9:DevCaps的 D3DDEVCAPS_HWTRANSFORMANDLIGHT位可以用来表示设备是否支持变换和光照的硬件的计算,假定caps为D3DCAPS9类型的一个实例并且已经初始化,测试代码如下:

bool supportsHardwareVertexProcessing;
//如果这些位是打开的状态,就表示硬件设备支持他
if(caps. DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
    //该位表示逻辑真,也就是表示硬件设备支持变换和光照的硬件计算
    supportsHardwareVertexProcessing =true;
}
else{
    supportsHardwareVertexProcessing =false;
}

猜你喜欢

转载自blog.csdn.net/DY_1024/article/details/84103998
今日推荐