マインクラフトの世界の照明


10

Minecraftは主に高さマップに基づいており、そのheigtmap情報を使用して世界に光を当てるゲームです。私の理解から、ハイトマップの最高点は太陽光の影響を受けた領域の終わりです。その上にあるものはすべて日光に照らされ、その下にあるものはすべて、半径8ブロックの近くにある光の影響を受けます。

したがって、世界の最上部に浮島がある場合、その下にあるすべてのものは本質的に洞窟と見なされます。2つのライトが同じポイントに影響を与える場合、より明るいライトが優先されます(それについては不明です)。

どちらの方法でも、Minecraftsライティ​​ングモデルにはいくつかの問題があります。まず、世界にハイトマップがない場合、太陽光を放出するはずであるものとそうでないものを正確に把握するのが難しくなります。単純な方法は、世界が(私の場合)浮遊岩であると仮定し、各軸を両方向からトラバースし、岩の始点と終点を理解することです。しかし、岩のへこみが暗闇にあるはずがないので、これは問題を完全に排除しません。

Minecraft自体は、ブロックのマテリアルに関する情報と一緒に、チャンク内のライト情報をキャッシュします。したがって、世界が変更された場合にのみ、照明を更新する必要があります。残念ながら、そのプロセスは、更新やライトの迅速な変更では依然としてかなり遅く、照明の遅れが見られます。これは、多くのブロック(TNT、日没など)が変更され、最速のコンピューター(またはMac上のJava)を実行していない場合に特に当てはまります。

私の3Dグラフィックス照明についてのまだ限られた理解から、Minecraftのような世界は最大の問題ではないはずです。どのように問題に取り組みますか?

ボクセルの世界での照明の基本的な要件は

  1. 単一フレームで発生する可能性があるほど速く更新します。グラフィックデバイスでライティングを行い、変更されたライト情報をメインRAMにダウンロードできる場合があります。
  2. ライト情報はメインゲームロジックですぐに利用できる必要があるため、グラフィックデバイスに完全に基づいているわけではありません。
  3. ライトの更新はチャンクに対してローカルであるか、他の制限がある必要があるため、サイズが非常に大きい可能性のある世界全体を再ライトする必要はありません。

主なアイデアは、ライトの更新を高速にすることです。必ずしもより美しくする必要はありません。一般的なライトレンダリングのパフォーマンスを向上させるために、SSAOを簡単に追加することができます。

回答:


7

Minecraftの照明は非同期に計算され、ジオメトリにベイクされます。リアルタイムでは行われません。

各ボクセルは、そのボクセルのライティングをおそらく1バイトとして格納します(または2、ノッチはレイヤードアプローチを使用して昼と夜のサイクルを可能にします)。光のレベルは16しかありません。世界を照らすために、Minecraftは2パスを行います。1つは日光用で、もう1つは洞窟などに光を伝播またはフラッディングするためのものです。どの光源も最大で16ブロックしか光を伝播できないため、照明は局所化されます。水と溶岩はほとんど同じように機能します。

詳細については、彼のブログをご覧ください。http//notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work


知っている。私はそれを上に書いたと思います(明るさ4ビットの解像度を差し引いたもの)。
Armin Ronacher、2010

1

GPU Render to Textureを使用して結果をダブルバッファリングできないので、常に各フレームをリードバックするために利用可能な計算された照明情報を入手できますか?

照明のためにこのデータをどのように整理するかは完全にあなた次第ですが、照明アルゴリズムの速度を改善することだけを目的としているのに、なぜこれが調査の最初の選択肢にならないのかわかりません。


まさに私が考えていたもの。ほとんどのCPUとは異なり、ほとんどすべてのGPUは、この種の大規模な並列計算演習用に設計されています。
Grant Peters

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.