THREE.JS:在正确的 z 索引处渲染大而远的物体,并仍然放大到小物体

THREE.JS: Render large, distant objects at correct z-indicies and still zoom into small objects

我有一个正在绘制(按比例)地球、月球和一些航天器的场景。当月球被地球遮挡时,它并没有消失,而是仍然可见(通过地球)。

从我的 research 我发现部分问题是我的相机的 near 设置太小了,如链接的文章中所述,near 的小值导致 z 排序中的四舍五入对很远的物体感到困惑。

这里的复杂性在于,当相机放大时,我需要有细粒度的 z 索引,以查看航天器(与地球相比,半径最大为 61 米的物体,称重 r =~ 6.5e+06 meters)。为了使月球和地球比例尺上的物体以正确的顺序渲染,近处必须至少为 100,000 米,在这一点上我看不到近处的物体。

一个解决方案是将比例缩小为公里,但我不能失去精度,更喜欢使用米。

关于如何在正确的 z 索引处渲染非常大、遥远的对象,同时保持比例和放大小对象的能力,有什么想法吗?

我的想法(不知道如何实现):

问题可能出在 z-test 而不是 z-precision。这意味着:z-test 不适用(可能是因为您使用 alpha 混合渲染透明对象)或 z-test 适用于非默认测试(例如覆盖远而不是近)。

尝试使用没有透明度的简单着色器渲染整个场景,以确保透明度不是错误的根源。 要在没有 z 测试的情况下解决 z 顺序,您应该在每一帧自己对对象进行排序以确定渲染顺序(从远到近)。

根据@WestLangley 的回答,解决方案只是将选项logarithmicDepthBuffer: true 添加到渲染器:

this.renderer = new THREE.WebGLRenderer({antialias: true, logarithmicDepthBuffer: true});