Minecraftは主に高さマップに基づいており、そのheigtmap情報を使用して世界に光を当てるゲームです。私の理解から、ハイトマップの最高点は太陽光の影響を受けた領域の終わりです。その上にあるものはすべて日光に照らされ、その下にあるものはすべて、半径8ブロックの近くにある光の影響を受けます。
したがって、世界の最上部に浮島がある場合、その下にあるすべてのものは本質的に洞窟と見なされます。2つのライトが同じポイントに影響を与える場合、より明るいライトが優先されます(それについては不明です)。
どちらの方法でも、Minecraftsライティングモデルにはいくつかの問題があります。まず、世界にハイトマップがない場合、太陽光を放出するはずであるものとそうでないものを正確に把握するのが難しくなります。単純な方法は、世界が(私の場合)浮遊岩であると仮定し、各軸を両方向からトラバースし、岩の始点と終点を理解することです。しかし、岩のへこみが暗闇にあるはずがないので、これは問題を完全に排除しません。
Minecraft自体は、ブロックのマテリアルに関する情報と一緒に、チャンク内のライト情報をキャッシュします。したがって、世界が変更された場合にのみ、照明を更新する必要があります。残念ながら、そのプロセスは、更新やライトの迅速な変更では依然としてかなり遅く、照明の遅れが見られます。これは、多くのブロック(TNT、日没など)が変更され、最速のコンピューター(またはMac上のJava)を実行していない場合に特に当てはまります。
私の3Dグラフィックス照明についてのまだ限られた理解から、Minecraftのような世界は最大の問題ではないはずです。どのように問題に取り組みますか?
ボクセルの世界での照明の基本的な要件は
- 単一フレームで発生する可能性があるほど速く更新します。グラフィックデバイスでライティングを行い、変更されたライト情報をメインRAMにダウンロードできる場合があります。
- ライト情報はメインゲームロジックですぐに利用できる必要があるため、グラフィックデバイスに完全に基づいているわけではありません。
- ライトの更新はチャンクに対してローカルであるか、他の制限がある必要があるため、サイズが非常に大きい可能性のある世界全体を再ライトする必要はありません。
主なアイデアは、ライトの更新を高速にすることです。必ずしもより美しくする必要はありません。一般的なライトレンダリングのパフォーマンスを向上させるために、SSAOを簡単に追加することができます。