Direct X 12 – Stenciling

stencil buffer也是一个“屏幕后”的buffer,我们可以使用该buffer来实现某些特殊效果。stencil buffer和back buffer以及depth buffer有着相同的分辨率,也就是说stencil buffer中的第ij个像素对应back buffer和depth buffer中的第ij个像素。在4.1.5小节中我们了解到,当stencil buffer确定时,其将被附加到depth buffer。正如stencil的字面意义,stencil buffer犹如一个模板,其可以禁止某些像素被绘制到back buffer中。

例如,当实现镜面效果时,我们需要把镜子前的物体进行反射;然而我们希望反射的图像只在镜面中显示。我们可以使用stencil buffer来禁用反射后物体的像素,除非其位于镜面内(如下图所示)。

上图中,左边的骷髅在镜面中的显示是正确的。而骷髅没有显示在墙面上是因为墙面部分的像素无法通过depth test。然而,墙面外的部分,我们还是能看到骷髅。右边的图像中,我们使用了stencil buffer,禁止其在被绘制在非镜面的区域。

stencil buffer和depth buffer的设置都由D3D12_DEPTH_STENCIL_DESC表示,我需要将其设为D3D12_GRAPHICS_PIPELINE_STATE_DESC::DepthStencilState。最有效的学习stencil buffer的方法就是研究现有的demo范例。

阅读更多Direct X 12 – Stenciling