0

我目前正在做一个 XNA 项目,我需要创建一个画中画叠加来从多个角度显示 3D 场景。目前我正在尝试使用 2 个视口来执行此操作。主要的填满整个屏幕并按需要工作。第二个放置在第一个角的一个角中(与该角重叠),并且小于第一个大小的五分之一。除了视口的大小和位置之外,两者之间唯一真正的区别是它们的相机在场景中的位置。

只要第二个视口是第二个绘制的,并且在重叠的角落中没有靠近第一个视口的相机的物体,这实际上工作得更好。但是,如果有一个对象靠近相机并且在第一个视口的角落,对象似乎会因为第一个视口的对象而经历遮挡剔除。但是,第一个视口的遮挡对象并未显示在第二个视口空间中。

我的问题是如何防止“跨视口剔除”的发生?我已经搜索了所有内容,我可以找到的关闭线程建议将第二个视口绘制到 RenderTarget2D 并使用 SpriteBatch 显示生成的纹理。虽然这样做确实解决了遮挡问题,但它确实对 z 排序、CCW 剔除和我的水效果造成了混乱,所有这些我在使用默认渲染目标时从未遇到过问题。

4

1 回答 1

0

这个问题,至少在我的情况下,似乎已经通过简单地清除绘制 2 个视口之间的深度缓冲区来解决。我通过在绘制各个视口的函数调用之间添加以下行来做到这一点

GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);

我在尝试使用 Stencil 缓冲区防止主视口在第二个视口下方绘制时遇到了这个解决方案,但在此发现之前我所做的一切并没有真正产生明显的效果。在我删除了所有 Stencil 代码之后,看起来我得到了想要的效果。抱歉,如果不弄乱第一个视口,我无法真正解释它的工作原理或原因,因为我自己也不知道。

于 2015-06-10T20:03:17.973 回答