我正在开发一个XNA项目,我需要创建一个Picture in picture Overlay来从多个角度显示3D场景。目前我正在尝试使用2个视口来执行此操作。主要填充整个屏幕并按预期工作。第二个放置在第一个角落的一个角落(与角落重叠),并且小于第一个角落的大小的五分之一。除了视口的大小和位置之外,2之间唯一真正区别的是它们在场景中放置相机。
只要第二个视口被绘制到第二个并且在重叠的角落中没有靠近第一个视口的摄像机的对象,这实际上有效。但是,如果有一个物体靠近相机并且在第一个视口的角落中,对象似乎会因第一个视口的对象而受到遮挡剔除。但是,第一个视口的遮挡对象未显示在第二个视口空间中。
我的问题是如何阻止“跨视口剔除”的发生?我已经搜遍了所有可以找到的关闭线程建议将第二个视口绘制到RenderTarget2D并使用SpriteBatch来显示生成的纹理。虽然这样做确实解决了遮挡问题,但它对z排序,CCW剔除以及我的水效应造成了影响,所有这些都是我从未遇到过使用默认渲染目标的问题。
答案 0 :(得分:0)
这个问题,至少在我的情况下,似乎只是通过在绘制2个视口之间清除深度缓冲区来解决。我通过在绘制单个视口
的函数调用之间添加以下行来完成此操作 GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);
我试图使用Stencil缓冲区来防止主视口在第二个下面绘制时遇到了这个解决方案,但是在此发现之前我所做的一切都没有明显的效果。删除所有Stencil代码后,看起来我得到了预期的效果。抱歉,但我无法解释如何或为什么这样做而不会弄乱第一个Viewport因为我自己没有线索。