我目前正在做一个XNA项目,我需要在图片叠加中创建一个图片,从多个角度显示3D场景。目前我正试图使用2个视口来做到这一点。主程序填充整个屏幕,并按预期工作。第二个被放置在第一个的一个角上(与第一个角重叠),小于第一个的五分之一大小。除了视口的大小和位置,这两者之间唯一的区别是它们的相机在场景中的位置。
只要第二个视口是第二个绘制的,并且在重叠的角落里没有物体靠近第一个视口的相机,这实际上工作得很好。然而,如果有一个物体靠近相机,在第一个视口的角落里,物体似乎会因为第一个视口的物体而经历遮挡剔除。第一个视口的遮挡对象不会显示在第二个视口空间中。
我的问题是如何防止"交叉视口剔除"的发生?我已经搜索了所有的关闭线程,我可以找到建议绘制第二个viewport到RenderTarget2D,并使用SpriteBatch来显示结果纹理。虽然这样做确实解决了遮挡问题,但它对z顺序,CCW剔除和我的水效果造成了混乱,所有这些都是我使用默认渲染目标从未遇到过的问题。
这个问题,至少在我的情况下,似乎已经通过简单地清除绘制2个视口之间的深度缓冲来解决。我通过在绘制单个Viewports
的函数调用之间添加以下行来做到这一点 GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);
我跑在这个解决方案,而试图使用模板缓冲,以防止主视图下绘制第二,但我所做的一切之前,这一发现并没有真正有明显的影响。在我删除了所有的模板代码后,它看起来像我得到了想要的效果。对不起,但我不能真正解释如何或为什么这工作没有搞乱第一个Viewport,因为我没有线索自己。