读书笔记--D3D预备知识

1.      表面

表面是D3D主要用于存储2D图像数据的一个像素矩阵。虽然我们可以将表面存储的数据视为一个矩阵,但像素数据实际存储在一个线性数组中。表面的宽度和高度都用像素来度量。跨度用字节来度量。

在代码中,我们用接口IDirect3DSurface9来描述表面。该接口提供了几种直接从表面读取和写入数据的方法,以及一种获取表面相关信息的方法。接口IDirect3DSurface9最重要的方法如下:

LockRect  该方法用于获取指向表面存储区的指针。通过指针运算,可对表面中的每一个像素进行读写操作。

UnlockRect 如果调用了LockRect方法,而且已执行完访问表面存储区的操作,必须调用该方法以解除对表面存储区的锁定。

GetPos  该方法可通过填充结构D3DSURFACE_DESC来获取该表面的描述信息。

结构D3DLOCKED_RECT的定义如下:

typedef strcut_D3DLOCKED_RECT

{

                    intPitch;

                    void*pBits;

}D3DLOCKED_RECT;

2.      多重采样

用像素矩阵表示图像时往往会出现块状效应,多种采样便是一项用于平滑块状图像的技术。对表面进行多重采样常用于全屏反走样。

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

3.      像素格式

创建表面或纹理时,常常需要指定资源的像素格式。像素格式可用D3DFORMAT枚举类型的枚举常量来定义。常见格式:

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

D3DFMT_X8R8G8B8 每个像素由32位组成。自最左端起,8位分配给Alpha值,8位分配给红色,8位分配给绿色,8位分配给蓝色;

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

4.      内存池

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

D3DPOOL_DEFAULT 默认值。该类型的内存池指示D3D将资源放入最合适该资源类型及其使用方式的存储区中。该存储区可能是显存,AGP存储区或系统存储区。注意,调用函数IDirect3DDevice::Rect之前,必须对默认内存池中的资源销毁或释放。上述函数调用之后,还必须对内存池中的资源重新进行初始化。

D3DPOOL_MANAGE 放入该托管内存池中的资源将交由D3D管理(即这些资源将根据需要被设备自动转移到显存或AGP存储区中)。此外,这些资源将在系统存储区中保留一个备份。这样,必要时D3D会将这些资源自动更新到显存中。

D3DPOOL_SYSTEMMEM 指定将资源放入系统存储区中。

D3DPOOL_SCRATCH 指定将资源放入系统存储区中。不同于前述类型D3DPOOL_SYSTEMMEM,这些资源不受图形设备的制约。所以,设备无法访问该类型内存池中的资源。但这些资源之间可相互复制。

5.      交换链和页面置换

D3D维护着一个表面集合,该集合通常由两到三个表面组成,称为交换链。该集合用接口IDirect3DSwapChain9来表示。

交换链和页面置换技术主要用于生成更加平滑的动画。

位于前台缓存槽中的表面对应于当前在显示器中显示的图像。显示器并不是立即显示由前端缓存所表示的图像,例如,当显示器刷新频率为60Hz时,显示一帧图像需要1/60秒。应用程序的帧频经常与显示器的刷新频率不同步(应用程序绘制一帧图像的速度可能要快于显示器显示一帧图像的速度)。但是,直到当前帧在显示器中显示完毕后,才将前台缓存中内容更新为下一帧。与此同时,在显示器显示前台缓存内容期间,我们也不想停止应用程序的绘制。所以,我们将下一帧内容绘制到一个离屏表面—后台缓存中。这样,当显示器将前台缓存中的内容显示完毕后,我们将其置换到交换链的末端,并将交换链中的下一个后台缓存提升为前台缓存,这个过程称为提交。

完成绘制功能的程序结构为:

(1)      在后台缓存中进行绘制

(2)      提交后台缓存的内容

(3)      回到步骤1

6.       深度缓存

深度缓存是一个只含有特定像素的深度信息而不喊图像数据的表面。深度缓存为最终绘            制的图像中的每一个像素都保留了一个深度项。深度缓存用于计算每个像素的深度值并进行深度测试。深度测试的基本内容是依据深度值让处于同一位置的不同像素进行竞争,以选出应写入该位置的像素。距离摄像机最近的像素获胜,并被写入深度缓存的相应位置上。深度缓存的格式决定了深度测试的精度。一般情况下,大多数应用程序使用24位深度缓存已足以获得满意的效果。

7.      顶点运算

在D3D中,可用两种不同方法进行顶点计算,软件顶点运算或硬件顶点计算。无论采用何种配置的硬件,软件顶点运算总是会被支持,所以总是可以使用的。而硬件顶点运算只有得到图形卡的支持才可以使用。

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值