Beleuchtung in einer Minecraftian Welt

10

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

  1. 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.
  2. 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.
  3. 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.

Armin Ronacher
quelle

Antworten:

7

Die Beleuchtung in Minecraft wird asynchron berechnet und in die Geometrie eingebrannt. Es wird nicht in Echtzeit durchgeführt.

Jedes Voxel speichert die Beleuchtung für dieses Voxel, wahrscheinlich als einzelnes Byte (oder 2, Kerbe verwendet einen mehrschichtigen Ansatz, um Tag- und Nachtzyklen zu ermöglichen). Es gibt nur 16 Lichtstufen. Um die Welt zu erleuchten, macht Minecraft 2 Pässe. Eine für das Sonnenlicht und eine andere, um das Licht in Höhlen und dergleichen auszubreiten oder zu fluten. Die Beleuchtung ist lokalisiert, da jede Lichtquelle ihr Licht nur in höchstens 16 Blöcken Entfernung ausbreiten kann. Wasser und Lava funktionieren fast gleich.

Weitere Informationen finden Sie in seinem Blog: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work

zfedoran
quelle
Ich kenne. Ich glaube, ich habe das oben geschrieben (abzüglich der Helligkeitsauflösung von 4 Bit).
Armin Ronacher
1

Können Sie GPU-Rendering nicht verwenden, um Ihre Ergebnisse zu texturieren und doppelt zu puffern, sodass Sie immer berechnete Beleuchtungsinformationen zum Zurücklesen jedes Frames zur Verfügung haben?

Wie Sie diese Daten für die Beleuchtung organisieren würden, liegt ganz bei Ihnen, aber ich verstehe nicht, warum dies nicht die erste Option für eine Untersuchung sein sollte, wenn Sie nur die Geschwindigkeit Ihres Beleuchtungsalgorithmus verbessern möchten.


quelle
Genau das, was ich dachte. Im Gegensatz zu den meisten CPUs sind so gut wie alle GPUs für diese Art von massiven parallelen Rechenübungen ausgelegt.
Grant Peters
1

Echtzeit-Rendering-Leute scheinen eine Liebesbeziehung zu Minecraft zu haben. Es gab einen Kommentar darüber, wie sie die Beleuchtung noch nicht herausgefunden haben. Aber vielleicht möchten Sie auf weitere Entwicklungen / Links gespannt bleiben.

http://www.realtimerendering.com/blog/?s=minecraft

Oolong-Süchtiger
quelle