DirectX 11 学习笔记-05【深度模板】

深度缓冲区 

深度缓冲区(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:模板测试时使用的掩码,0xff表示不屏蔽任何 

StencilWriteMask:更新模板缓冲时使用的掩码,0xff表示不屏蔽任何位 

FrontFace/BackFace:如何处理前向/后向的三角形,它是一个D3D11_DEPTH_STENCILOP_DESC 结构体,包括三个操作方式和一个比较函数。 

  1. StencilFailOp:模板测试失败时如何更新缓冲区 

  2. StencilDepthFailOp:深度测试失败时如何更新模板缓冲区 

  3. StencilPassOp:均通过时如何更新模板缓冲区 

  4. StencilFunc:模板测试时使用的比较函数 

D3D11_STENCIL_OP: 

D3D11_STENCIL_OP_KEEP:不更新,保持不变 

D3D11_STENCIL_OP_ZERO:置为0 

D3D11_STENCIL_OP_REPLACE:用参考值替换 

D3D11_STENCIL_OP_INCR_SAT:递增。到达最大值则取最大值。 

D3D11_STENCIL_OP_DECR_SAT:递减,最小为0。 

D3D11_STENCIL_OP_INVERT:反转缓冲区中的位。 

D3D11_STENCIL_OP_INCR:递增,最大时取为0。 

D3D11_STENCIL_OP_DECR:递减,最小值时取为最大值。 

也可以在effect中直接定义和设置深度/模板状态 

深度/模板状态的使用 

和其他状态一样,首先需要用Device创建好状态,然后使用OMSetDepthStencilState将状态绑定到管线中。OMSetDepthStencilState接受两个参数,第一个为状态的指针,第二个参数为模板参考值。模板测试的行为由状态决定,先使用StencilFunc比较当前模板值和参考值,返回true则为通过否则则不通过。根据定义的三个操作方式,比如StencilPassOp定义为D3D11_STENCIL_OP_REPLACE时,如果模板测试通过,则会将参考值写入当前的模板。 

你可能感兴趣的:(C++,DirectX)