Minecraft ist ein Spiel, das größtenteils auf einer Höhenkarte basiert und diese Heigtmap-Informationen verwendet, um die Welt mit Licht zu überfluten. Nach meinem Verständnis ist der höchste Punkt in der Höhenkarte das Ende des von Sonnenlicht beeinflussten Bereichs. Alles darüber wird vom Sonnenlicht beleuchtet, alles darunter wird nur durch Licht in der Nähe in einem Radius von 8 Blöcken beeinflusst.
Wenn Sie also eine schwimmende Insel oben auf Ihrer Welt haben, wird alles darunter im Wesentlichen als Höhle angesehen. Wenn zwei Lichter denselben Punkt beeinflussen, gewinnt das hellere Licht (unsicher).
In beiden Fällen gibt es einige Probleme mit dem Beleuchtungsmodell von minecrafts: Wenn Ihre Welt keine Höhenkarte hat, ist es zunächst schwieriger herauszufinden, was genau Sonnenlicht aussenden soll und was nicht. Ein einfacher Weg wäre anzunehmen, dass die Welt (in meinem Fall) ein schwimmender Stein ist, und dann jede Achse aus beiden Richtungen zu durchqueren und herauszufinden, wo der Stein beginnt und endet. Dies beseitigt das Problem jedoch nicht vollständig, da Dellen im Fels nicht in der Dunkelheit liegen sollen.
Minecraft selbst speichert die Lichtinformationen in seinen Blöcken zusammen mit den Informationen über das Material eines Blocks. Nur wenn die Welt verändert wird, muss die Beleuchtung aktualisiert werden. Leider ist dieser Prozess bei Updates immer noch ziemlich langsam und bei schnellen Lichtwechseln kann man sehen, dass die Beleuchtung zurückbleibt. Dies gilt insbesondere dann, wenn sich viele Blöcke ändern (TNT, Sonnenuntergang usw.) und Sie nicht den schnellsten Computer ausführen (oder Java auf dem Mac).
Nach meinem noch begrenzten Verständnis der 3D-Grafikbeleuchtung sollte eine Welt wie Minecraft nicht das größte Problem sein. Wie würden Sie das Problem angehen?
Ich denke, die Grundvoraussetzungen für die Beleuchtung in einer Voxelwelt wären
- Aktualisieren Sie schnell genug, damit dies in einem einzelnen Frame geschehen kann. Möglicherweise kann die Beleuchtung im Grafikgerät vorgenommen und die geänderten Lichtinformationen in den Haupt-RAM heruntergeladen werden.
- Lichtinformationen müssen für die Hauptspiellogik schnell verfügbar sein, damit sie nicht vollständig auf dem Grafikgerät basieren: Begründung: Licht beeinflusst das Wachstum von Gras, das Laichen von Monstern usw.
- Leichte Updates müssten lokal zu einem Block sein oder eine andere Grenze haben, damit man nicht die ganze Welt neu beleuchten muss, die sehr groß sein könnte.
Die Hauptidee wäre, die Lichtaktualisierungen schnell und nicht unbedingt schöner zu machen. Für allgemeine Verbesserungen der Lichtwiedergabeleistung könnte man leicht SSAO zusätzlich zu dem hinzufügen, was zu viel schöneren Welten führen sollte.