如何只清除 depth/stencil 视图的一部分?
How do I clear only part of a depth/stencil view?
如果我想在 Direct3D 11 中清除整个 depth/stencil 视图,我可以轻松地调用 ID3D11DeviceContext::ClearDepthStencilView
。
Direct3D 11.1 添加了对使用 ID3D11DeviceContext1::ClearView
.
清除 渲染目标 视图的矩形部分的支持
但我看不出在 Direct3D 11 中只清除 depth/stencil 视图的一部分,而不是在所需区域上渲染四边形?这似乎是 Direct3D 9 的一个奇怪回归,在 Direct3D 9 中这是非常容易的。我是不是遗漏了什么,或者这真的不受支持吗?
没有只清除depth/stencil视图的一部分的功能。
这是我解决问题的方法:
- 制作纹理。将要清除的部分的Alpha设置为1,其他部分设置为0。
- 打开
AlphaTest
,只打开alpha为1的像素
- 打开
AlphaBlend
,将BlendOP
设为Add
,将SrcBlend
系数设为0,将DestBlend
系数设为1。
- 将
StencilTest
和DepthTest
设置为Always
,将StencilRef
设置为您要清除的值。
- 使用正交投影矩阵。
- 绘制一个刚好覆盖屏幕的矩形(z坐标/(ZFar-ZNear)将转换为深度),并在其上粘贴纹理。
删除 API 中的部分清除是有充分理由的。首先,始终可以通过绘制具有适当渲染状态的四边形来模拟它们,其次,所有 GPU 都具有快速清除和解析硬件。在预期逻辑中使用它们可以极大地提高渲染性能。
使用 DX11 清除 API,可以使用快速清除和后期 GPU 优化。快速清除深度缓冲区还为早期深度测试做准备(在像素着色之前,因为是的,真正的深度测试是 post 像素着色),并且一些访问深度缓冲区的带宽优化将渲染。如果你用四边形清除,你会失去所有,绘制成本会增加。
如果我想在 Direct3D 11 中清除整个 depth/stencil 视图,我可以轻松地调用 ID3D11DeviceContext::ClearDepthStencilView
。
Direct3D 11.1 添加了对使用 ID3D11DeviceContext1::ClearView
.
但我看不出在 Direct3D 11 中只清除 depth/stencil 视图的一部分,而不是在所需区域上渲染四边形?这似乎是 Direct3D 9 的一个奇怪回归,在 Direct3D 9 中这是非常容易的。我是不是遗漏了什么,或者这真的不受支持吗?
没有只清除depth/stencil视图的一部分的功能。 这是我解决问题的方法:
- 制作纹理。将要清除的部分的Alpha设置为1,其他部分设置为0。
- 打开
AlphaTest
,只打开alpha为1的像素 - 打开
AlphaBlend
,将BlendOP
设为Add
,将SrcBlend
系数设为0,将DestBlend
系数设为1。 - 将
StencilTest
和DepthTest
设置为Always
,将StencilRef
设置为您要清除的值。 - 使用正交投影矩阵。
- 绘制一个刚好覆盖屏幕的矩形(z坐标/(ZFar-ZNear)将转换为深度),并在其上粘贴纹理。
删除 API 中的部分清除是有充分理由的。首先,始终可以通过绘制具有适当渲染状态的四边形来模拟它们,其次,所有 GPU 都具有快速清除和解析硬件。在预期逻辑中使用它们可以极大地提高渲染性能。
使用 DX11 清除 API,可以使用快速清除和后期 GPU 优化。快速清除深度缓冲区还为早期深度测试做准备(在像素着色之前,因为是的,真正的深度测试是 post 像素着色),并且一些访问深度缓冲区的带宽优化将渲染。如果你用四边形清除,你会失去所有,绘制成本会增加。