如何仅清除深度/模板视图的一部分?

时间:2016-05-20 04:01:18

标签: directx directx-11 direct3d direct3d11

如果我想在Direct3D 11中清除整个深度/模板视图,我可以轻松拨打ID3D11DeviceContext::ClearDepthStencilView

Direct3D 11.1增加了使用ID3D11DeviceContext1::ClearView清除渲染目标视图的矩形部分的支持。

但我认为没有办法只清除Direct3D 11中深度/模板视图的一部分,而不是在所需区域上渲染四边形?这看起来像是来自Direct3D 9的一个奇怪的回归,这很简单。我错过了什么,还是真的不支持?

2 个答案:

答案 0 :(得分:1)

没有这样的功能只能清除深度/模板视图的一部分。 这是我解决问题的方法:

  1. 制作纹理。将部件的Alpha设置为清除为1,将其他部分设置为0。
  2. 打开AlphaTest,仅打开alpha为1的像素。
  3. 打开AlphaBlend,将BlendOP设为Add,将SrcBlend系数设为0,将DestBlend系数设为1。
  4. StencilTestDepthTest设置为Always,将StencilRef设置为您要清除的值。
  5. 使用正交投影矩阵。
  6. 绘制一个覆盖屏幕的矩形(z坐标/(ZFar-ZNear)将转换为深度),并在其上粘贴纹理。

答案 1 :(得分:-1)

有一个很好的理由去除API中的部分清除。首先,总是可以通过绘制具有适当渲染状态的四边形来模拟它们,其次,所有GPU都具有快速清除和解析硬件。在意图逻辑中使用它们可以大大提高渲染的性能。

使用DX11 clear API,可以使用快速清除和后者GPU优化。快速清除深度缓冲区也为早期深度测试做好准备(在像素着色之前,因为是,真正的深度测试是后像素着色),并且在访问深度缓冲区时将进行一些带宽优化。如果你用四边形清除,你就会失去所有这些,并且抽奖成本会上升。