2017-05-16 2 views
1

最近、私は惑星、太陽系、銀河などの大きなシーンをレンダリングしようとしており、フロート精度とzバッファ精度の有名な問題にぶつかってきました。私は、hereのように対数奥行きバッファを使ってzバッファの問題を緩和しました。しかし、私はまだ遠距離での浮動小数点精度の制限をどのように修正するかを考えていません。OpenGLのフレーム

私は発見した1つの一般的な方法は、ソーラーシステムと記載herehereとして銀河スケール= 1つのライトイヤー1つのユニット= 1 megameter例えば1ユニットに対して、異なる距離のための基準の異なるフレームを使用することです。後者のリンクでは、一人の人が具体的に示唆している

あなたは地球をメートルでモデル化し、それをキロメートルでモデル化した太陽系に付け加えることが考えられます。太陽系は、光年でモデル化されたミルキーな方法に取り付けられています。これは、数百万年前の光年で測定されたローカルクラスタに接続されています。

シーンをレンダリングすると、階層を下方向に横断し、各レベルで32ビットの浮動小数点数には十分な精度があります。

私の質問は、このメソッドを実際に実装する方法です。私は、異なる単位の測定値から移行するときに各オブジェクトをスケールするのですか?異なる座標系で描画されたオブジェクト間の相対的なサイズと距離をどのように維持するのですか?

答えて

2

これは興味深い質問です。答えは少し驚くかもしれません。重要な洞察は、スペースが本当に大きく、ほとんど空であることを認識していることです。つまり、宇宙のさまざまな物体が触れていないこと、そしてあなたが正しいことを得るために必要なのは、空に見られるような相対位置の出現であることを意味します... チート

だから、最初にすべてのオブジェクトを距離で並べ替えてから、同じ数値範囲の単位内にすべてを描画する、つまり星のシステム全体が惑星の地形と同じ範囲の数値で描画されるということです視点は上に位置しています。

あなたがスターシステムの小さなスケールのモデル、銀河、すべてのものを1つのアートインスタレーションに重ね合わせているようなものを浮かべることはありません。すべてが重なり合って奇妙に見える。

これは、「不正行為」が発生する場所です。スケール/距離の各大きさを別々のレイヤーにレンダリングし、Photoshopのレイヤーと同様に、いわゆる「合成」プロセスで結合します。このアプローチの主な問題は、参照のフレーム間のトランジションを取得することで、ポップアウトしないようにすることです。

同じスキームに従ったテクニックは3D Skyboxesです。本質的には、3D Skyboxのいくつかのレイヤーを特定の方向にレンダリングして合成しています。

+0

ありがとうございました。明確にするために、各スケールの大きさをフレームバッファまたはテクスチャにレンダリングして、それらを組み合わせたフラグメントシェーダでフルスクリーンクワッドをレンダリングするだけですか? – ArcaneEnforcer

+0

@ArcaneEnforcer:はい、テクスチャに裏打ちされたFBOを使用するのが、最近の一般的なアプローチです。しかし、別の方法は、各層によって隠された画素をマークするためにステンシルバッファを使用するのと同様に、まだ遮られていない画像領域がマスクされるようにすることです。次に、スケールの大きさがレンダリングされた後、深度バッファがクリアされ(深度バッファのみ)、次のレイヤがレンダリングされます。シーンにブレンドされたジオメトリが含まれていると、物が厄介になりますが、通常、大規模なスケールを除いてブレンドされたものは省略できます。 – datenwolf

関連する問題