1

GLKitで半透明のプリミティブを描きたいです。私はすでに深度テストを無効にしglDisable(GL_DEPTH_TEST)、ブレンディングを有効にしました

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

アルファ値が大きい場合 (例: 0.9)、近い三角形の上に表示されないように、最初に最も遠い三角形を描画する必要があります。これは、 glBlendFunc のドキュメントにも記載されています。

透明度は、ブレンド関数 (GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA) を使用してプリミティブを最も遠いものから最も近いものへと並べ替えるのが最適です。この透明度の計算では、フレーム バッファにアルファ ビットプレーンが存在する必要がないことに注意してください。

そしてOpenGL 透過性 FAQで:

アプリケーションで深度バッファリングを使用する場合、プリミティブをレンダリングする順序に注意する必要があります。完全に不透明なプリミティブを最初にレンダリングする必要があり、次に部分的に不透明なプリミティブを後ろから前にレンダリングする必要があります。プリミティブをこの順序でレンダリングしないと、部分的に不透明なプリミティブを通して表示されるプリミティブが深度テストを完全に失う可能性があります。

ただし、表示角度は変更される可能性があるため (レンダリング効果の を変更するとmodelViewMatrix)、最も遠いものから最も近いものへの順序は、現在の表示角度によって異なります。

OpenGL でプリミティブを正しい順序で自動的にレンダリングする方法はありますか? (現在の視野角に応じて)のz位置を計算し、フレームごとに(または、より正確には、視野角が変化するたびに、フレームごとに)数千の三角形を注文すると、コストがかかりすぎると思います、特にフレームごとにこの順序を GPU にプッシュする必要があるためです。

テクスチャの使用には関心がないことに注意してください (色付きの頂点のみ)。

4

2 に答える 2

5

相互のオーバーラップの問題により、堅牢なリアルタイムのソリューションがないため、自動ソリューションはありません。ASCII アートを許すなら、次のように配置された 4 つのクワッドを検討してください。

     +--+             +--+
     |  |             |  |
+---------------------|  |------+
|                     |  |      |
+---------------------|  |------+
     |  |             |  |
     |  |             |  |
     |  |             |  |
+----|  |-----------------------+
|    |  |                       |
+----|  |-----------------------+
     |  |             |  |
     +--+             +--+

正しい順序はありません。クワッドの少なくとも 1 つを 2 つに分割する必要があります。これは、BSP ツリーを構築するような事前スキームで行うことです。そのため、深度バッファリングが存在します。ほとんどのジオメトリが不透明であることに基づいて、ピクセルごとにこの問題を解決します。

したがって、続行するための最良の方法は次のとおりです。

  • 透明なジオメトリの BSP ツリーを構築します (完全な精度のため)。
  • 透明なジオメトリ用にオブジェクトごとの BSP ツリーを構築し、オブジェクトを前後に並べ替えます (かなり正確にするため)。
  • オブジェクトには多かれ少なかれ凸状の透明なセグメントしかない必要があるため、葉を 1 つ持つ BSP ツリーになってしまうため、1 つを構築し、後ろから前に並べ替えます (芸術に応じて、妥当な精度のため)。
  • すべての不透明なジオメトリを描画した後、加算ブレンディングを使用して任意の順序で描画します (外観は異なりますが、順序の問題はありません)。
于 2012-11-26T21:15:23.473 に答える
4

まず第一に、いいえ、OpenGL にこれを行わせる方法はありません。現在のカメラとモデルの位置 (つまり、モデル ビュー マトリックス) に基づいて、透明なジオメトリを手動で並べ替える必要があります。

これを実装するために、リアルタイムの実装では通常、個々の三角形をソートするのではなく、その論理サブセット (メッシュ、サブメッシュ) をソートします。問題のケースは次のようになります。

  • 単一のレンダリングされた要素の非凸ジオメトリ。通常、事前にジオメトリを手動で分割するか、アーティファクトを無視することで解決されます。
  • 異なる要素の交差するジオメトリ。通常は解決しません。

シーンを構築する際に、要素を (部分的に) 透過型と非透過型に分割することがパフォーマンス上重要です。このようにして、透明なジオメトリのみを並べ替える必要があるため、大規模な並べ替え操作を回避できます。

高度なテクニック

まったく異なるアプローチについては、デプス ピーリングや類似のテクニックを調べてください。これらのテクニックを正しく行うと、多くのメリットがあります。ただし、実際にそれらを実装している OpenGL ESタイトルは知りません。それはオプションではないという意味ではありません。

でも...

一般的な 3D プログラミングにまだあまり慣れていない場合は、手動の並べ替えに固執し、アーティファクトを最小限に抑えることを強くお勧めします。このようにして、そのような実装が特定のケースに十分かどうかについて、十分な情報に基づいた決定を下すことができます。

少なくとも、この機能を実装することで、今後プレイするすべてのビデオゲームで透明性に関連するレンダリングの問題をすぐに見つける (そして非常に気を散らす) 超人的な能力が自動的に付与されます。持つべき素晴らしいスキル。

于 2012-11-26T21:14:18.747 に答える