7

Android デバイス (OpenGL ES 2.0) の深度バッファーに書き込む必要があります。gl_FragDepthOGL ES 2.0 では書き込みができないため、回避策を見つける必要があります。私は実際にこれに似たレイキャスティングを介して球をレンダリングしたい: http://www.sunsetlakesoftware.com/2011/05/08/enhancing-molecules-using-opengl-es-20。ただし、この Web サイトで説明されているソリューション (特別な を使用して深度を書き込むオフスクリーン レンダー パスglBlendEquation) は、Apple デバイスでのみ機能し、Android では機能しません。これは、 GL_MIN_EXT-blending がサポートされていないためです。

私の Tegra3 タブレットでは、次のメソッドを実装できました: Android GLES20.glBlendEquation not working? (ちなみに、線形化された深度値を使用することをお勧めします。より良い結果が得られます!)これは非常にうまく機能しますが、もちろん、これは Nvidia GPU でのみ使用できます。

理論的には拡張機能がありますGL_EXT_frag_depth(「OpenGL ES フラグメント シェーダーはフラグメントの深度値を変更できますか? 」 を参照してください) が、Android デバイスでも使用できません。

最後に、(オフスクリーン レンダー パスで) 1 つの球だけの深度バッファーを書き込んでから、2 番目のレンダー パスで次の球の深度バッファーを書き込んで、3 番目のレンダー パスで 2 つを組み合わせることができます。そうすることで、n 個の球に対して 2*n+1 のレンダー パスが必要になります。これは非常に非効率的です。

アイデアが不足しているので、私の質問は次のとおりです。OpenGL ES 2.0 Android デバイスで深度バッファを書き込むための別の一般的な方法/回避策を考えられますか?

4

1 に答える 1

2

さて、ここでオプションが不足していることは確かです。私は Opengl ES をよく知らないので、これ以上の回避策はわかりません。

私の頭に浮かぶ唯一のことは、ブルートフォースマルチパスアプローチといくつかの前処理を組み合わせることです。

原子が互いに重なっていないグループに球を分類します。すべてのスフィアをタンパク質から 10 個未満のグループに分類できるはずです。次に、各グループのすべての球を 1 つのパスでレンダリングします。ここでは、球が重ならないため、頂点の深さは十分です。次に、結果を「深度ブレンド」できます。

これには、問題になる可能性のある前処理が必要です。

于 2012-07-05T08:03:30.643 に答える