2012-07-05 122 views
7

我需要在Android設備(OpenGL ES 2.0)上寫入深度緩衝區。由於gl_FragDepth在OGL ES 2.0下不可寫,所以我必須找到解決方法。我實際上想通過光線投射渲染球體,類似於:http://www.sunsetlakesoftware.com/2011/05/08/enhancing-molecules-using-opengl-es-20。 但是,本網站解釋的解決方案(屏幕渲染通道使用特殊的glBlendEquation編寫深度)僅適用於Apple設備,而不適用於Android,因爲GL_MIN_EXT -blending不受支持。在OpenGL ES 2.0中寫入深度緩衝區/深度值的解決方法

在我的Tegra3平板電腦,我能夠實現這個方法:Android GLES20.glBlendEquation not working?(順便說一句,我建議使用線性化的深度值,他們給出更好的結果!) 它的工作原理相當不錯,當然,這僅僅是在NVIDIA GPU可用。

理論上,擴展名爲GL_EXT_frag_depth(請參閱Can an OpenGL ES fragment shader change the depth value of a fragment?),但它在Android設備上也不可用。最後,你當然可以爲一個球體寫入深度緩衝區(在離屏渲染過程中),然後在第二個渲染過程中寫入下一個球體的深度緩衝區,並在第三個渲染過程中合併這兩個球體。在這樣做的時候,你會有2 * n + 1個n球的渲染通道 - 這似乎效率很低!

所以,因爲我用完了想法,我的問題是:您是否可以考慮另一種通用方法/解決方法來在OpenGL ES 2.0 Android設備上編寫深度緩衝區?

回答

2

那麼,你肯定會在這裏沒有選擇。我不知道有任何進一步的解決方法,因爲我不太瞭解Opengl ES。

是進入我腦海的唯一事情是蠻力多遍的方法與一些預處理結合:

排序的球進入其中原子相互不重疊的組。應該可以在10個以內的小組中對蛋白質中的所有球體進行分類。然後渲染每個組的所有球體一次。這裏的頂點深度是足夠的,因爲球體不重疊。然後你可以「深入混合」結果。

這需要一些預處理,這可能是一個問題。

+0

這聽起來像一個有趣的選擇!沒有我期望的那麼優雅的解決方案,但似乎沒有其他的......我可能會試一試。對於大多數蛋白質和其他小分子,深度排序應該足夠快。 – kroneml