2014-11-05 114 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