深度缓冲区
深度缓冲区(depth buffer)是一个不包含图像数据的纹理对象。常见的深度值范围在0.0 到1.0 之间,0.0表示离观察者最近的物体,1.0表示离观察者最远的物体。深度缓冲区中每个元素都与后台缓冲区中的每个元素一一对应。深度缓冲区主要用于判断物体的哪些像素位于其他物体之前,从而不用关心绘制物体的先后顺序。
渲染时,当发现某个像素具有更小的深度值时,就更新该像素以及它在深度缓冲区中的相应深度值。通过一方式,在最终得到的渲染结果中只会包含那些离观察者最近的像素。而深度测试则是用当前像素片段的深度值和深度缓冲区中的像素深度进行比较,保留离观察者最近的像素。
创建深度缓冲区时需要为它指定格式。模板缓冲区和深度缓冲区位于同一个纹理,所以格式中需要指定模板缓冲区和深度缓冲区对应的位数。
创建好深度和模板缓冲区后,可以通过改变深度模板状态来控制深度测试/模板测试。
使用D3D11_DEPTH_STENCIL_DESC来配置深度/模板状态 。
深度设置
DepthEnable:启用/禁用深度测试。同时禁用情况下,深度缓冲区中的元素也不会被更新。
DepthWriteMask:D3D11_DEPTH_WRITE_MASK_ZERO或D3D11_DEPTH_WRITE_MASK_ALL。可以用于禁用深度缓冲区的写入,禁用后深度测试仍然有效。
DepthFunc:一般使用D3D11_COMPARISON_LESS。支持自定义的深度测试函数。
这里要和RSstate中的DepthClipEnable区别。DepthClipEnable开关的是平截头相关的深度裁剪,对即超出平截头几何体的裁剪。
模板设置
StencilEnable:开启/关闭
StencilReadMask:模板