我有两个渲染目标,后缓冲区和一个UI渲染目标,将在其中绘制所有2d UI。
我已经使用图形调试器来确认是否使用正确的数据写入了两个渲染目标,但是最后我很难将两者正确结合。
问题:
我的世界对象直接绘制到后缓冲区,因此显示这些对象没有问题,但是现在如何将UI渲染目标覆盖在后缓冲区之上?
所需效果:
答案 0 :(得分:0)
有几种方法可以做到这一点。最简单的方法是将UI元素渲染为同时具有RenderTargetView
和ShaderResourceView
的纹理,然后将整个纹理作为正投影投影空间中的单个四边形渲染到后缓冲区。这有效地在后缓冲区的屏幕空间中绘制了一个包含用户界面的2D正方形。它还具有允许透明的好处。
您还可以使用OutputMerger
阶段在渲染世界几何图形时将UI渲染目标与后缓冲区混合。您需要注意如何设置混合操作,因为这可能会导致在UI上绘制项目或进行不适当的混合。
如果用户界面不是透明的,则可以先进行用户界面渲染,然后在模板缓冲区中标记用户界面下的区域,然后在启用模板测试时进行世界渲染。这将导致GPU忽略UI下方的任何像素,而不将其发送到像素着色器。
还可以修改上述内容,以将最小深度值写入UI渲染目标内的像素,以确保其下方的所有几何图形均无法通过深度测试。此修改将释放用于反射镜/阴影/等的模具缓冲区。
以上所有内容适用于在现有3D世界上绘制的平面UI。要实际绘制似乎是世界一部分的更复杂的UI,您需要实际将元素渲染到世界空间中的3D对象,或进行复杂的投影操作以使其看起来像它们。