跨视口遮挡剔除
Cross Viewport oclussion culling
我目前正在处理一个 XNA 项目,我需要在其中创建画中画叠加层以从多个角度显示 3D 场景。目前我正在尝试使用 2 个视口来执行此操作。主要的填满整个屏幕并按需要工作。第二个放在第一个的一个角上(与那个角重叠),并且小于第一个大小的五分之一。除了视口的大小和位置之外,两者之间唯一真正的区别是它们在场景中的相机位置。
只要第二个视口是第二个绘制的,并且在重叠角中没有靠近第一个视口的相机的对象,这实际上效果很好。但是,如果有一个物体靠近相机并且位于第一个视口的角落,则对象似乎会由于第一个视口的对象而经历遮挡剔除。但是,第一个视口的遮挡对象未显示在第二个视口中space。
我的问题是如何防止 "cross viewport culling" 发生?我到处搜索,我能找到的关闭线程建议将第二个视口绘制到 RenderTarget2D 并使用 SpriteBatch 显示生成的纹理。虽然这样做确实解决了遮挡问题,但它在 z 顺序、CCW 剔除和我的水效果上造成了混乱,所有这些我在使用默认渲染目标时从未遇到过问题。
这个问题,至少在我的情况下,似乎已经通过简单地清除绘制 2 个视口之间的深度缓冲区来解决。我通过在绘制各个视口的函数调用之间添加以下行来做到这一点
GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);
我 运行 在尝试使用 Stencil 缓冲区以防止主视口在第二个视口下绘制时参与此解决方案,但我在此发现之前所做的一切并没有真正产生明显的效果。在我删除所有 Stencil 代码后,看起来我得到了想要的效果。抱歉,但我无法在不弄乱第一个视口的情况下真正解释这是如何或为什么工作的,因为我自己也不知道。
我目前正在处理一个 XNA 项目,我需要在其中创建画中画叠加层以从多个角度显示 3D 场景。目前我正在尝试使用 2 个视口来执行此操作。主要的填满整个屏幕并按需要工作。第二个放在第一个的一个角上(与那个角重叠),并且小于第一个大小的五分之一。除了视口的大小和位置之外,两者之间唯一真正的区别是它们在场景中的相机位置。
只要第二个视口是第二个绘制的,并且在重叠角中没有靠近第一个视口的相机的对象,这实际上效果很好。但是,如果有一个物体靠近相机并且位于第一个视口的角落,则对象似乎会由于第一个视口的对象而经历遮挡剔除。但是,第一个视口的遮挡对象未显示在第二个视口中space。
我的问题是如何防止 "cross viewport culling" 发生?我到处搜索,我能找到的关闭线程建议将第二个视口绘制到 RenderTarget2D 并使用 SpriteBatch 显示生成的纹理。虽然这样做确实解决了遮挡问题,但它在 z 顺序、CCW 剔除和我的水效果上造成了混乱,所有这些我在使用默认渲染目标时从未遇到过问题。
这个问题,至少在我的情况下,似乎已经通过简单地清除绘制 2 个视口之间的深度缓冲区来解决。我通过在绘制各个视口的函数调用之间添加以下行来做到这一点
GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);
我 运行 在尝试使用 Stencil 缓冲区以防止主视口在第二个视口下绘制时参与此解决方案,但我在此发现之前所做的一切并没有真正产生明显的效果。在我删除所有 Stencil 代码后,看起来我得到了想要的效果。抱歉,但我无法在不弄乱第一个视口的情况下真正解释这是如何或为什么工作的,因为我自己也不知道。