Xna 交叉视口偶然性剔除

Xna 交叉视口偶然性剔除,xna,overlay,viewport,xna-4.0,occlusion-culling,Xna,Overlay,Viewport,Xna 4.0,Occlusion Culling,我目前正在从事一个XNA项目,我需要创建一个画中画叠加,从多个角度显示3D场景。目前,我正在尝试使用2个视口来完成此操作。主屏幕充满整个屏幕,并按需要工作。第二个放置在第一个角的一个角(与该角重叠),并且小于第一个角大小的五分之一。除了视口的大小和位置之外,两个视口之间唯一真正不同的是它们的摄影机在场景中的位置 只要第二个视口是第二个绘制的,并且在重叠的角点中第一个视口的摄影机附近没有对象,这实际上非常有效。但是,如果在摄影机附近和第一个视口的拐角处有一个对象,则第一个视口的对象似乎会经历遮挡消

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

只要第二个视口是第二个绘制的,并且在重叠的角点中第一个视口的摄影机附近没有对象,这实际上非常有效。但是,如果在摄影机附近和第一个视口的拐角处有一个对象,则第一个视口的对象似乎会经历遮挡消隐。但是,第一个视口的遮挡对象不会显示在第二个视口空间中


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

这个问题,至少在我的情况下,似乎是通过简单地清除两个视口之间的深度缓冲区来解决的。为此,我在绘制各个视口的函数调用之间添加了以下行

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

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