2014-11-05 118 views
2

我试图实现代码从this tutorial,但在更大的比例(半径= 100000单位)。丑陋渲染在云上

我不知道大小是否重要,但在我的地球上渲染云彩有一个奇怪的渲染。 正如本教程所做的那样,我使用了两个球体和三个纹理(地球图,凹凸贴图,云)。

这里的结果(这是糟糕的,如果云层很接近): Earth

更多的云是地球表面的更紧密,更该故障是可见的。如果云层足够远(但这不太现实),问题就会完全消失。

我该怎么办?

+0

如果您的近平面为0.01,如在教程中,请尝试将其增加到100,例如: – WestLangley 2014-11-05 01:13:49

回答

4

使用对数深度缓冲区而不是线性缓冲区。这是一个非常简单的变化,只是使logarithmicDepthBuffer当您创建THREE.WebGLRenderer像这样:

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

这里是你可以看看一个例子: http://threejs.org/examples/#webgl_camera_logarithmicdepthbuffer

使用polygonOffset通过LJ_1102的建议是一个可能性,但它不应该是必要的。

+0

非常感谢,它的工作原理。你也可以看到我对LJ_1102的回答的评论。 关于你的答案,我想对数深度缓冲区没有被优化?现在在渲染持续时间中我看不到差异,但我将来需要为我的场景添加更多元素。 – 2014-11-05 10:41:23

+1

@MorganTouvereyQuilling日志缓冲区在片段着色器中有一个开销,它很好地增加了一个对数函数。就所有其他事情而言,需要为片段的颜色和位置进行计算 - 这是我看到的一个微小的下降。换句话说:性能开销非常小。此外,这种开销是静态的 - 无论您在场景深度测试中有多少物体基本上每个渲染像素完成一次。来源https://github.com/mrdoob/three.js/blob/1769fbfc6c994b51a54c15a5c096855fd3cb8a1a/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl – travnik 2014-11-05 10:53:37

+0

帮助,最后您的解决方案会导致我的粒子呈现问题。我使用ShaderParticleEngine作为我的粒子引擎,现在粒子呈现在所有其他元素后面,请参阅:http://i.imgur.com/cPYvE7U.png(船上反应堆的粒子显示在地球后面)在反应堆后面 - 发射源是**里面的**反应堆) – 2014-11-05 13:28:42

1

由于深度缓冲区分辨率不足,您遇到的问题是z-fighting

你基本上有三种选择来抵消这一点:

  1. 写/使用多纹理着色呈现在一个球体所有三个纹理。

  2. 增加球面之间的距离。 /减少你的近剪裁平面和远剪裁平面之间的距离。

  3. 使用polygonOffsetPOLYGON_OFFSET_FILL renderstate可以抵消由外部球体写入的深度值。 Read more about polygonOffset here

+0

谢谢!最后,我使用了travnik解决方案,它完美地工作。但我有一些问题。你说的深度缓冲区分辨率不够。你是说,从某种意义上说,我使用的球体半径值太大?我不认为是因为我发现了z战斗的起源:我使用64段(宽度和高度)绘制球体。如果我将段数增加到例如512,问题几乎完全消失。它让我觉得z战斗发生是因为两个球体的面部因为平坦而战斗。只有顶点处于“良好高度”。 – 2014-11-05 10:38:07

+1

顺便说一句:我想接受你的答案和特拉夫尼克的答案,但我认为这是不可能的。我给了你一个赞成票,但我很抱歉我不能做更多的事情,因为你的答案更加完整,并提供了更多的调查可能性。 – 2014-11-05 10:45:28

+0

问题并不在于你的球体太大,而是球体之间的距离相对于球体的大小而言“太小”。默认深度缓冲区是非线性的,并且朝向远裁剪平面的分辨率下降。您的假设是正确的,因为您增加球体的线段数量,可以更好地近似理想球体,并且可以减少人脸深度值的插值误差。 – 2014-11-05 15:04:23