百度博客 d3d 深度测试

原创 2012年03月29日 00:47:25

复制下石头的百度空间

为什么会引入  深度测试这个概念?

在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试。半透明物体的绘制不同于不透明物体,Direct3D通过alpha混合实现半透明物体的绘制。深度测试可以简化复杂场景的绘制,alpha混合可以使绘制的三维场景更完整、更逼真。

在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。


深度缓冲区与深度测试

要理解深度测试,首先需要理解深度缓冲区。深度缓冲区是Direct3D用来存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区。当Direct3D将一个场景渲染到目标表面上时,它使用深度缓冲区来决定光栅化后各个多边形的像素的前后遮挡关系,最终决定哪个颜色值被绘制出来。也就是说,Direct3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素。如果深度测试结果为TRUE,则绘制当前像素,并用当前像素点的深度来更新深度缓冲区,反之则不予绘制。通常情况下,深度缓冲区对应于屏幕大小的一块二维区域。

对一个启用了深度缓冲区的场景进行光栅化操作时,渲染表面上的每个点都要进行深度测试。在深度测试开始时,深度缓冲区的深度值被设置为该场景可能出现的最大值,渲染表面上的颜色值被设置为背景颜色值。然后测试场景内即将绘制的每个多边形,看它是否小于存储在深度缓冲区中的深度值,如果该多边形的深度值更小,则该深度值被更新到深度缓冲区中,并将渲染表面上当前点的颜色值替换为该多边形的颜色。如果多边形在这一点的深度值更大,将继续测试列表中的下一个多边形。

后台缓冲区 需要增一些属性来设置深度缓冲

在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试。半透明物体的绘制不同于不透明物体,Direct3D通过alpha混合实现半透明物体的绘制。深度测试可以简化复杂场景的绘制,alpha混合可以使绘制的三维场景更完整、更逼真。

在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。

 

深度缓冲区与深度测试

要理解深度测试,首先需要理解深度缓冲区。深度缓冲区是Direct3D用来存储绘制到屏幕上的每个像素点的深度信息的一块内存缓冲区。当Direct3D将一个场景渲染到目标表面上时,它使用深度缓冲区来决定光栅化后各个多边形的像素的前后遮挡关系,最终决定哪个颜色值被绘制出来。也就是说,Direct3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素。如果深度测试结果为TRUE,则绘制当前像素,并用当前像素点的深度来更新深度缓冲区,反之则不予绘制。通常情况下,深度缓冲区对应于屏幕大小的一块二维区域。

对一个启用了深度缓冲区的场景进行光栅化操作时,渲染表面上的每个点都要进行深度测试。在深度测试开始时,深度缓冲区的深度值被设置为该场景可能出现的最大值,渲染表面上的颜色值被设置为背景颜色值。然后测试场景内即将绘制的每个多边形,看它是否小于存储在深度缓冲区中的深度值,如果该多边形的深度值更小,则该深度值被更新到深度缓冲区中,并将渲染表面上当前点的颜色值替换为该多边形的颜色。如果多边形在这一点的深度值更大,将继续测试列表中的下一个多边形。

 

创建深度缓冲区

若要在Direct3D图形程序中应用深度测试,首先必须在创建Direct3D渲染设备时创建深度缓冲区,示例代码如下:

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.EnableAutoDepthStencil	= TRUE;                   // 表示由Direct3D创建并管理一个深度缓冲区

d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 表示深度缓冲区中每一个像素的深度值由16位的二进制数表示

激活深度测试

深度缓冲区随Direct3D渲染设备创建好后,调用Direct3D渲染状态设置函数IDirect3DDevice9::SetRenderState(),将第一个参数设为D3DRS_ZENABLE,第二个参数设为TRUE,激活深度测试:

g_device->SetRenderState(D3DRS_ZENABLE, TRUE);设置深度测试IDirect3DDevice9::SetRenderState()函数设置深度测试函数,第一个参数设置为D3DRS_ZFUNC:

第二个参数设置为想要设置的深度测试函数,它属于D3DCMPFUNC枚举类型,定义如下:

Defines the supported compare functions.

typedef enum D3DCMPFUNC
{
D3DCMP_NEVER = 1,
D3DCMP_LESS = 2,
D3DCMP_EQUAL = 3,
D3DCMP_LESSEQUAL = 4,
D3DCMP_GREATER = 5,
D3DCMP_NOTEQUAL = 6,
D3DCMP_GREATEREQUAL = 7,
D3DCMP_ALWAYS = 8,
D3DCMP_FORCE_DWORD = 0x7fffffff,
} D3DCMPFUNC, *LPD3DCMPFUNC;

通常情况下,深度测试函数设置为D3DCMP_LESS,表示当测试点深度值小于深度缓冲区中相应值时,通过深度测试并绘制相关像素,这样没有被遮挡的物体才显示,而被遮挡的物体就不显示。示例代码如下:

g_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);

更新深度缓冲区

设置了深度测试函数后,还需要设置深度测试成功时对深度缓冲区如何操作,是保持原来的深度值,还是用当前像素的深度值更新对应的数值。

D3DRS_ZWRITEENABLE
TRUE to enable the application to write to the depth buffer. The default value is TRUE. This member enables an application to prevent the system from updating the depth buffer with new depth values. If FALSE, depth comparisons are still made according to the render state D3DRS_ZFUNC, assuming that depth buffering is taking place, but depth values are not written to the buffer.

示例代码如下:

g_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

表示如果通过测试,则用当前像素的深度值更新深度缓冲区中对应的数值,这是最常用的设置,也是默认设置。



D3D深度测试

深度测试 使用诸如Direct3D这样的渲染API在屏幕上渲染图形时,就会碰到所谓的“透支”(指的是渲染全景造成的内存浪费)问题。当在屏幕上绘制交迭(重爹)的两个或多个图元时,就会出现透支。这些图元...
  • binbingg
  • binbingg
  • 2013年02月27日 14:37
  • 454

Direct3D---深度测试和Z缓存

Direct3D_Init()部分代码1、创建深度缓冲区//----------------------------------------------------------------------...
  • u012319493
  • u012319493
  • 2017年02月09日 17:47
  • 368

深度测试Alpha混合方法Alpha测试

转载自:http://blog.csdn.net/xoyojank/article/details/2058566 1.       深度测试 a)         深度缓冲区:屏幕上每个像素点的...
  • Blues1021
  • Blues1021
  • 2015年07月31日 23:35
  • 1772

D3D深度测试和Alpha混合

 1.       深度测试a)         深度缓冲区:屏幕上每个像素点的深度信息的一块内存缓冲区.D3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素.b) ...
  • xoyojank
  • xoyojank
  • 2008年01月22日 12:07
  • 4436

百度博客 d3d 雾化

百度空间的地址 http://hi.baidu.com/caolei7299/blog/category/diectx%209.0
  • caolei7299king
  • caolei7299king
  • 2012年03月29日 00:45
  • 85

DirectX11 深度/模板状态

深度/模板状态1. 深度/模板描述当创建ID3D11DepthStencilState接口时,第一步是要填充一个D3D11_DEPTH_STENCIL_DESC实例:typedef struct D3...
  • sinat_24229853
  • sinat_24229853
  • 2015年10月04日 12:47
  • 1503

DirectX11 深度模板视图(depth-stencil)

深度模板视图(depth/stencil)1. 什么是深度测试? 深度测试, 如我们再第二章所主意的那样,用于确保物体表面以正确的顺序来绘制和显示,而不需要进行多边形排序。 例如,如果我们有两个三...
  • sinat_24229853
  • sinat_24229853
  • 2015年09月24日 13:19
  • 2007

ID3DXLine的使用

开始写了一个,但是在缩放的过程中线的状态总是显示不对,原来是SetPatternScale搞得鬼,不设置它,SetPattern中的值就不能正确的起到作用,例子如下,3D的改天在搞,困了:-0  D3...
  • cjzdq2000
  • cjzdq2000
  • 2008年11月29日 22:01
  • 1827

OpenGL学习脚印:深度测试(depth testing)

写在前面 上一节我们使用AssImp加载了3d模型,效果已经令人激动了。但是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我...
  • ziyuanxiazai123
  • ziyuanxiazai123
  • 2016年08月14日 21:40
  • 5999

如何为你的CSDN博客加入百度统计

以前CSDN使用的 量子统计 可以很好的统计我们的博客的访问数量、地域等等信息,但是不知道后来为什么不在使用了,那么如何找到 一种替换的方式那?下边,就给大家介绍一下如何使用百度统计。百度统计账户注册...
  • u010870518
  • u010870518
  • 2017年01月04日 17:24
  • 3603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:百度博客 d3d 深度测试
举报原因:
原因补充:

(最多只允许输入30个字)