首页 > 解决方案 > 如何使用 DirectX 11 将我的 UI 渲染目标覆盖到后台缓冲区?

问题描述

我有两个渲染目标,后台缓冲区和一个 UI 渲染目标,所有 2d UI 都将在其中绘制。

我已经使用图形调试器来确认两个渲染目标都被写入了正确的数据,但是我在最后将两者结合起来时遇到了麻烦。

问题:

我的世界对象直接绘制到后备缓冲区,所以显示这些没有问题,但是我现在如何将 UI 渲染目标覆盖在后备缓冲区上?


想要的效果

在此处输入图像描述

后台缓冲区渲染目标 在此处输入图像描述

UI 渲染目标 在此处输入图像描述

标签: renderingdirectx-11rendertarget

解决方案


有几种方法可以做到这一点。最简单的方法是将您的 UI 元素渲染为同时具有 aRenderTargetView和 a的纹理ShaderResourceView,然后将整个纹理作为正交投影空间中的单个四边形渲染到后台缓冲区。这有效地在后台缓冲区的屏幕空间中绘制了一个包含您的 UI 的 2D 正方形。它还具有允许透明度的好处。

您还可以OutputMerger在渲染世界几何时使用舞台将 UI 渲染目标与后台缓冲区混合。您需要小心设置混合操作的方式,因为这可能会导致项目被绘制在 UI 上,或混合不当。

如果您的 UI 不透明,您可以先进行 UI 渲染并在模板缓冲区中标记 UI 下方的区域,然后在启用模板测试时进行世界渲染。这将导致 GPU 忽略 UI 下方的任何像素,而不是将它们发送到像素着色器。

上面的内容也可以修改为将最小深度值写入 UI 渲染目标内的像素,确保其下方的所有几何体都无法通过深度测试。此修改将释放用于镜像/阴影/等的模板缓冲区。

以上所有内容都适用于在现有 3D 世界上绘制的平面 UI。要实际绘制看起来是世界一部分的更复杂的 UI,您需要将元素实际渲染到世界空间中的 3D 对象,或者执行复杂的投影操作以使其看起来像。


推荐阅读