0

OpenGLES 2.0 キューブ アプリケーションを作成しようとしています。アイデアは、キューブの 6 つの面すべてにテクスチャ (アルファ 75%) を適用することでした。これは、立方体を回転させても、任意のフレームで 6 つの面すべてを見ることができることを意味します。これで、深度テスト (私のアプリにはこれが必要です!!) とブレンディングが有効になりました。Depth 関数は LEQUAL、ブレンド関数は SRC_ALPHA、ONE_MINUS_SRC_ALPHA です。

ここでの問題は、一部の立方体面で下にある面が表示されないことです。ロジックが他の立方体面で正常に機能するため、これを理解できません。念のため、CULL_FACE を無効にしました。

前もって感謝します。

よろしく、

パズラー

4

1 に答える 1

2

面は、定義された順序で描画されます。立方体が回転しても、描画順序は変更されません。一部の顔は、最初にカメラの近くに描画されます。その後、いくつかの顔が描画されますが、Z-test は既にカメラに近いピクセルがあるため、描画を行う必要はありません。

ここでの問題は、レンダリング時に OpenGL|ES 2.0 が面を並べ替えないことです。透明度と深度を正しく処理することは、3D プログラミングの真の課題として残っていますが、このような簡単なケースでは、面を後ろから前に並べ替えることができます。後ろから前に描くことを「Painter のアルゴリズム」と呼び、ソートを「深度ソート」または「Z ソート」と呼びます。

シンプルで、明らかに最善ではなく、確実に非効率的な方法は、次のように機能する可能性があります。

  1. 3つの頂点の平均を計算することにより、顔の中心頂点を計算します
  2. カメラ(ビュー+投影)と可能なモデルマトリックスを介して変換することにより、それらをスクリーン空間に投影します
  3. 何らかのソート アルゴリズムで Z 値をソートする
  4. この順序で頂点を使用して頂点バッファーを構築するか、単に新しい順序でインデックス バッファーを書き換えます (頂点が変更されていない場合は移動する要素が少なくなります)。
  5. 通常どおり立方体をレンダリングする

この問題を処理するより良い方法があり、あらゆる種類の高度な最適化があります。しかし、このような単純なケースをカバーするチュートリアルは見つかりませんでした。適切なキーワードが見つからなかっただけかもしれません。

于 2010-06-09T09:48:58.543 に答える