10

私は OpenGL ES で惑星を描いており、いくつかの興味深いパフォーマンスの問題に遭遇しています。一般的な質問は、「非常に詳細な」テクスチャを球体にレンダリングするにはどうすればよいかということです。

(球体は保証されています。私は球体固有の最適化に興味があります)

規範事例:

  • ウィンドウは約です。2048 x 1536 (例: iPad3)
  • 地球儀のテクスチャ マップは 24,000 x 12,000 ピクセル (米国の半分のサイズの領域が画面の全幅に収まります)
  • 地球儀は、ズームイン (米国が画面全体に表示) からズームアウト (地球全体が表示) まで、あらゆる場所で表示されます。
  • 最低 3 つのテクスチャ レイヤーが必要です (惑星の表面に 1 つ、昼夜の違いに 1 つ、ユーザー インターフェイスに 1 つ (異なる領域をハイライト))
  • 一部のレイヤーはアニメーション化されています (つまり、実行時にテクスチャをすばやくロードしてドロップする必要があります)。

制限:

  • 最上位のタブレットは 4096x4096 テクスチャに制限されています
  • 最上位のタブレットは 8 つの同時テクスチャ ユニットに制限されています

問題:

  • 合計で、単純に 5 億ピクセルのテクスチャ データです
  • デバイスには 8 つのユニットしかないため、小さなテクスチャに分割してもうまくいきません。テクスチャ レイヤーが 1 つだけの場合、8 つのテクスチャ ユニットに分割でき、すべてのテクスチャは 4096x4096 未満になります - しかし、それは単一のレイヤーしか許可しません
  • レイヤーを別々のジオメトリとしてレンダリングすると、フラグメント シェーダーを使用してブレンドする必要があるため、うまく機能しません。

...現時点で、実行可能と思われる唯一のアイデアは次のとおりです。

  1. 球を NxM の「球の断片」に分割し、それぞれを個別のジオメトリとしてレンダリングします
  2. ズームアウト時にミップマップを使用して低解像度テクスチャをレンダリングする
  3. ...ズームインしたときにそれらのほとんどを切り取るために単純なカリングに依存し、カリングできない場合はミップマッピングを使用して小さな (より) テクスチャを使用します

...しかし、もっと簡単な方法/より良いオプションがあるはずですか?

4

2 に答える 2

0

仮想テクスチャ拡張機能が (まだ) ないため、これは ES では簡単に実行できません。基本的に、仮想テクスチャリング (一部の ES デバイスは ARB_texture_array を実装) を実装し、球体に対して可能な限り低い解像度 (ビューに依存) でストリーミングする必要があります。そうすれば、すべてをフラグメント シェーダーで行うことができ、ジオメトリの細分化は必要ありません。これを実装する方法の詳細については、このプレゼンテーション (および論文) を参照してください

計算すると、1 GB (24,000 x 12,000 ピクセル x 4 B) をリアルタイムでストリーミングすることは不可能です。また、ユーザーがすべてを同時に見ることができないため、無駄でもあります。

于 2014-05-28T08:53:07.510 に答える