8.1 Direct3D的深度测试

本文介绍了Direct3D中的深度测试技术,用于处理游戏场景中的遮挡关系。深度测试通过比较新绘制像素与深度缓冲区的深度值来决定像素是否可见,而Alpha混合技术则用于处理半透明遮挡。深度测试包括创建深度缓冲区、激活测试、设置测试函数、更新缓冲区和清除缓冲区等步骤。通过实例展示了深度测试如何影响图形的渲染效果。
摘要由CSDN通过智能技术生成

关于Direct3D的深度测试

什么是深度测试?可以设想在一个比较复杂的游戏场景中,通常需要绘制多个物体,这些物体之间必然会存在遮挡关系,离观察点较远的物体会因为近处物体的遮挡而不可见或只有部分可见,Direct3D中提供深度测试功能来实现这种效果。
深度测试与Alpha混合有什么关系?其实在现实世界中遮挡也分不同的情况,如果遮挡另一个物体的物体是半透明的,那么此时在场景中观察到的被遮挡物体并非是不可见的,也并非是正常可见的,而是“模糊可见”(请允许让我这样形容,你一定可以理解我要表达的意思)的。然而,深度测试只是提供了“可见”和“不可见”两种测试结果,对于这种半透明遮挡便无能为力,此时便可以用Alpha混合技术产生这种半透明遮挡的效果,有关半透明技术的使用会在下一篇文章中详细记录。
下面用Photoshop软件模拟了一下上述表达的意思,图中黑色mask的透明度依次是100%、80%、0%,很明显中间80%的透明度中的红色三角形不能简单的用“可见”与“不可见”来表达。
这里写图片描述
这里写图片描述

深度测试技术的实现

要理解深度测试,首先需要理解深度缓冲区。深度缓冲区是Direct3D用来,存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区。当Direct3D将一个场景渲染到目标表面上时,它使用深度缓冲区来决定各个图形的像素的前后遮挡关系,最终决定那个颜色值会被绘制出来。
这里写图片描述
可以结合上面深度测试的原理图来理解这一过程。Direct3D通过比较当前绘制的像素点和对应深度缓冲区的点的深度值来决定是否绘制当前像素。如果深度测试结果为true,则绘制当前像素,并用当前像素点的深度值来更新深度缓冲区,反之则不予绘制。通常情况下,深度缓冲区对应于屏幕大小的一块二维 区域。对于一个启用了深度缓冲区的场景进行光栅化处理时,渲染表面上的每个点都要进行深度测试。
拿上图中的绘制情景梳理这一过程:在深度测试开始时,深度缓冲区的深度值被设置为该场景可能出现的最大值。渲染表面的颜色值被设置为背景颜色值。首先渲染紫色的三角形,Direct3D首先会判断此三角形像素绘制的位置(x,y)是否出现在渲染表面上,如果出现,测试此像素点的深度值,看它是否小于存储在深度缓冲区中的深度值,因为开始的时候,深度缓冲区被设置为场景中可能的最大值,所以,此处紫色三角形像素的深度值要小于深度缓冲区中原有的深度值,则该深度值被更新到深度缓冲区当中,并将渲染表面上当前点的颜色值替换为紫色;绘制黄色五边形的时候,深度测试进行到两个图形重合的部分,由上面的分析过程可知,黄色的深度值比紫色的深度值更小,所以深度缓冲区会被更新成黄颜色所处的深度,而屏幕上两图形重合的部分也只会渲染成黄色。这样,从我们用户看来,后面紫色的三角形便被前面黄色的五边形“遮挡”了!
注意:在上面的叙述中涉及到两个操作(已经被设置为粗体表示):比较(compare)和更新(update)。这两个操作 在使用深度测试的程序代码中会有所体现。

在程序中使用深度测试

由深度测试技术概念的分析中可以概括出使用深度测试的基本步骤:

(1)创建深度缓冲区
(2)激活深度测试
(3)设置深度测试函数
(4)更新深度缓冲区
(5)清除深度缓冲区

下面简单的分析一下上述每个基本步骤的作用和使用方法。
(1)创建深度缓冲区
若要在Direct3D图形程序中使用深度测试,首先必须在创建Direct3D渲染设备时创建深度缓冲区。还记得在最开始创建Direct3D设备的时候ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值