2009-06-18 9 views
8

Oblivion(と他のゲーム、私は確信していますが、十分に遊んでいない)の技術の背後にある基本的な前提は、遠くからのオブジェクトが曖昧に遠くから彼らを見る?たとえば、大きなタワーが1マイル離れていると、地平線から突き出ているぼんやりとした長方形が見えます...明らかに、巨大な3Dシーンはすべてレンダリングできません。ハイトマップの場合、近似アルゴリズムがありますカメラから離れた高さマップの品質を下げるために使用されますが、特定のオブジェクトの場合、それらを表示する最善の方法は何ですか?遠方の3Dオブジェクトレンダリング[ゲーム]

風景の周りの特定の場所を選んで、その場所を中心にすべての高さマップと3Dモデルを描画し、写真を撮るプログラムを作成する、事前レンダリングのテクニックを考えていました。それはいくつかの写真を撮るだろう、そして、プレーヤーがその場所の近くにいるとき、写真はスカイボックスとして使われるだろう。

本当に粗い3Dモデルを保存することですが、3Dレンダリングシステムで建物のラフモデルを具体的にどのように選択し、他のあまり重要ではない(おそらく見えない - 遠方からの)物体?あなたのハイハットマップと一緒にそれをどう保管しますか?おそらく設計上、そのような重要なランドマークをいくつか持っていて、それらのリストを小さなファイルに保存すれば、各フレーム上で実際に遠く離れたものをレンダリングできますか?

私は、Haloシリーズがゲームをレベルに分割し、各レベルに異なる手作りのスカイボックスがあることを認識しています。これは私が最初の提案で行ったことのようなものですが、私はそれについては分かりません。私は自分のアイデアの中に他のアイデアや洗練されたものを集めようとしているので、限られた時間と知識で試作するものを選ぶことができます。

もう1つの関連するトピックは、離れたところに山を表示する方法です。これは高さマップの一部であり、上の3Dモデルではないため、実際には粗いバージョンを持つことはできません。また、近似アルゴリズムは本当に遠く離れた山から山を台無しにするかもしれません(あなたがそう遠い幾何学を近似してレンダリングしようとしていると仮定すると、そうはならないでしょう)。あなたが答えでこれをカバーしても、ボーナスポイント。 :)

ありがとう!

P.S.私はOpenGLを使用しています。私は基本的なコンセプトを探していますが、サンプルコードを投稿する場合は、OpenGLの関数と用語を使用してください! :)

編集:ありがとうございました!ドキュメント化の目的で私が見つけた別のリソースは次のとおりです。 第4章ゲームプログラミングGems 2では遠くの風景をスカイボックスにレンダリングするコンセプトについて説明しています。 http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416 (残念ながらプレビューは章の最初のページです...

また、これらの記事を読んだ後でも、LODはまだかなり近い距離にあるオブジェクトのためのものです。オブジェクトが1ピクセルも大きくない場合でも、それらをグラフィックカードに供給している場合は、LODを使用するかどうかにかかわらず、電力を無駄にするだけです。そして、それは絶対最大の遠くの物体を除いてすべての場合に当てはまります。いくつかの高層ビルやいくつかの山がありますが、細かいディテール・モデル(茂み、樹木、岩石、その他の風景など)は、このような距離からは見えません。だから、私はスカイボックス技術へのレンダリングが好きです。私がこの橋に着くと、それが私がそれをどのように通過するかです。すべてのモデルでLODを使用するようにしていますが、私はそのような距離をレンダリングしません。

私は、オレビオンのゲームのラインに沿ってもっと考えているので、答えはゲームのジャンルに依存するかもしれません。

答えて

7

いくつかのテクニック、:細部の

  • レベル。上記で概説した。
  • ミップマッピング。テクスチャの場合。
  • 視野。適切なズームレベルを選択することで、カメラが見ることができるもの数を制限します。ビューfrustrum cullingも参照してください。
  • ファークリッピングプレーン。遠く離れた場所の閉塞:ほとんどのゲームでは、霧、山、または他の言い訳を使用して、どれだけ離れているかを厳密に判断することができます。これは、オクツリーまたは他の何らかの技法を使用して実装することができる。これはオブジェクト全体、ポリゴンなどに基づいていてもよく、通常は前述の山のすぐ後ろに発生するように設定されています。
  • アリーナ/レベル/エリア/何でも - 一度に1つのアリーナで遊ぶことを人為的に制限するゲームもあります。利点は明らかです(他のすべてのアリーナでオブジェクトを無視するようになります)
  • 事前レンダリング - これはあなたが上に示唆しているものです。遠くあり、静的なシーンについては、「典型的な」ビューでシーンをレンダリングし、それの背景にテクスチャ作成、またはそれを使用するスカイボックス/反射マップ/などのため

考えは捨てることですユーザーが気付き始める前に可能な限り詳細に説明します。

これらの処理を自動的に行う既存のツールキットが多数ありますが、コストがかかる傾向があります。あなたが深刻なアプリを見ているなら、私は彼らが含むソリューションを少なくとも研究することをお勧めします。

+1

あなたの視野はやや甘いと思います。 FOVは、通常、あなたが探している "カメラ"の角度を指します。遠くのオブジェクトを切り取るポイントは、「遠いクリッピングプレーン」と呼ばれます。 –

+0

@NeilN、そうです。私は答えを修正します。 –

0

1つの手法はLOD(詳細レベル)です。オブジェクトがカメラから離れているほど、三角形が少なくなります。ここにリンクです:http://www.stefan-krause.com/

7

私はこれがあなたの3Dモデルの場合Level of Detail (LOD)

+0

私はそれが少し小さいと思っています...私は本当に大規模な話ですが、LODは機能しません。これは、マイル離れたすべてのモデルが引き続き描かれていることを意味するためです。 – Ricket

+2

はい、ある特定の時点で、あまりにも遠く離れているすべてのオブジェクトを削除することができます。これは、3次元プログラムの設定で描画距離となることがあります。何かがそれを超えると、レンダリングを止めるだけです。 – AvatarOfChronos

+0

Oblivionは実際に遠方の地形レンダリングにLoDを使用します。 elderscrolls.comにはいくつかの情報があります。 http://cs.elderscrolls.com/constwiki/index.php/Landscape_LOD_Tutorial – Kylotan

4

を探して、技術がlevel of detailと呼ばれるものだと思います。基本的に、複数のバージョンのモデルは、コンテキストに基づいて適切なものが使用可能に保たれます。それは常に距離だけではなく、他の状況でもフレームレートを維持するために使用することができます。

ミップマッピングが有効になっている必要があります。低い解像度のモデルでは大きなテクスチャが輝き、アニメーションには注意してください。アニメーションスケルトンの下でモデルを切り替えるのは難しいので、モデルをロードするときでも同じスケルトンを維持することが1つの方法です。

地形とオブジェクトモデルの両方に動的なLODシステムがありますが、これらはCPUが重いことがあります。

0

遠方のオブジェクトのテクスチャにレンダリングすることはできますが、パースペクティブがある閾値を超えて変化するたびにテクスチャを再描画する必要があります。パースペクティブが遠くの山々のあなたの例のように頻繁に変わることのない遠方のオブジェクトには効果的ですが、ビューのソースがあまりにも速く動いている場合や、近すぎる場合はフィッシュアイ効果のようなものが得られます地震時の空のレンダリングの初期段階。この種のシステムは、広大な距離を含んでいるeve onlineのような世界に自らを貸す。

これはもちろんあなたのアーセナルの別のトリックですが、あなたはまだLODをある程度必要とします。

0

モデルのローディテールバージョンは、車やオブジェクトで特にうまく機能します。地形では本当に面倒です。私はバトルゾーンタイプのゲームやPCのフライトシミュレータに取り組んできました。小さな霧が、細部の間の "ポップ"を隠すのに役立ちます。

下の詳細では、テクスチャマッピングは、しばしば、いくつかの単色ポリゴンに置き換えられます。


「別のより明白な技術は本当にラフな3Dモデルを格納することですが、その後どのように3Dレンダリングシステムは、特に建物の大まかなモデルをレンダリングすることを選択すると、他の粗いモデルはあまり重要で(そしておそらくありませんその距離から見ることができないオブジェクト)、あなたのハイハットマップと一緒にそのようなものをどのように保存しますか?

地形をグリッドにし、どのグリッドセルにどのオブジェクトが表示されているかのリストを保持できます。あなたが言及したものも含め

0

地形を扱う1つの方法は、複数の解像度のタイルを持つことです。 Virtual EarthやGoogle Mapsのように、世界を再帰的にタイルに分割します。したがって、レベル0には4タイル、レベル1には16タイルなどがあります。次に、いくつかのLoDアルゴリズムを使用してズーム/スケールを決定し、与えられたエリアの適切な地形タイルをロードします。

0

遠隔オブジェクトの事前レンダリングされたビューを動的にキャッシュする技術は、通常「詐称者」と呼ばれます。 Here's件名に関する古いGame Programming Gemsの書籍の記事。

高さマップの地形の詳細レベルを処理する手法は多数あります。いくつかの一般的なテクニックの概要については、vterrain.orgをご覧ください。一般的な原則は、ほとんどのバリアントで同じです - 地形をセクションに分割し、距離の低い解像度のジオメトリとテクスチャを使用しますが、詳細は異なります。

グラフィックスカードに送信されるオブジェクトの数を減らすために、通常、ある種の可視性のカリングが実装されます。最も簡単なのは、境界球が画面のピクセルのあるしきい値をカバーしているモデルを完全に削除することです(LODシステムを使用している場合には、どのLODを使用するかを選択することになります)。より効率的にするために、カントリングのためのある種の階層的空間データ構造、例えばクォードツリーまたはオクトツリー、球体ツリー、ポータルシステム(屋外環境ではあまり使用されない)、単純なグリッドベースのスキームなどを使用することができます。階層内のより高いレベルのノードをカリングすることによって、多くのリーフノードを見ることさえ避けることができる。簡単な例は、建物を取り除き、個別に見ることなくその子ノード(建物の内部または上部のオブジェクト)をすべて効果的に取り除くことです。

忘却のようなゲームでは、他のオブジェクトの背後に隠れていると判断してオブジェクトをグラフィックスハードウェアに送信する前に、ある種のオクルージョンを間引きしている可能性があります。これを行うためのさまざまなテクニックがありますが、その中にはかなり複雑なものもあります。