© Liashko/Shutterstock.com
Entwickler Magazin
Teil 3: Einführung in die prozedurale Landschaftsgestal- tung

Landschaftsgärtnerei in Minecraft-Welten

Im letzten Teil dieser Artikelserie haben wir uns damit befasst, wie sich Minecraft-Welten dank moderner OpenGL-Rendering-Techniken ruckelfrei darstellen lassen und wie man die im Vorfeld erforderlichen Berechnungsschritte auf mehrere Worker-Threads verteilen kann. Nun werden wir uns mit den Grundlagen der prozeduralen Landschaftsgestaltung auseinandersetzen und in diesem Zusammenhang die Geheimnisse des Tile-basierten Texture Mappings, der Zufallszahlen und Noise-Berechnungen (Rauschen) enthüllen.

Alexander Rudolph


Eines haben die letzten beiden Artikel zweifelsohne gezeigt: man sollte sich durch die Schlichtheit und den gewöhnungsbedürftigen Anblick eines durch Minecraft inspirierten Spiels nicht täuschen lassen. Die Herausforderungen hinsichtlich der Speicherverwaltung, des Renderings sowie der zugehörigen Programmabläufe sind nicht zu unterschätzen. Nachdem wir im ersten Teil unserer kleinen Minecraft-Serie die theoretische Vorarbeit geleistet haben, sind wir im zweiten Artikel auf die wichtigsten Programmabläufe in unserer „kleinen“ Demoanwendung zu sprechen gekommen. Dort haben wir gezeigt, wie sich blockbasierte Spielewelten dank moderner OpenGL-Rendering-Techniken effizient und ruckelfrei darstellen lassen, und haben demonstriert, wie man die im Vorfeld erforderlichen Berechnungsschritte auf mehrere Worker-Threads verteilen kann. Zur Vermeidung potenzieller Speicherprobleme haben wir uns dazu entschlossen, die komplette Spielewelt in lauflängenkodierter Form im Speicher zu verwalten. Bedenken Sie, dass bereits eine verhältnismäßig kleine Minecraft-Welt mit einer quadratischen Ausdehnung von 3 000 Metern und einer Höhe von nur 256 Metern genügend Raum für 2,304 Milliarden Blöcke mit einer Kantenlänge von jeweils einem Meter (3 000*3 000*2 56 = 2 304 000 000) bietet. Würde man nun für die Beschreibung der jeweiligen Blockeigenschaften auf eine 1-Byte-Variable vom Datentyp unsigned __int8 zurückgreifen (die Position eines Blocks in der Spielewelt ergibt sich aus der Position im zugehörigen unsigned __int8-Array), entspräche dies einem Gesamtspeicherbedarf von 2,304 GB. Lediglich der darzustellende Bereich, der vom Spieler nach Belieben umgestaltet werden kann (hierbei greifen wir auf ein Ray-Casting-Verfahren zurück), wird in unkomprimierter Form im Speicher gehalten.

Im zweiten Artikel haben Sie darüber hinaus ein einfaches Verfahren kennengelernt, mit dessen Hilfe man die Lichtausbreitung in einer blockbasierten Welt auch ohne umfangreiche mathematische Berechnungen oder komplizierte physikalische Theorien auf der CPU simulieren kann. Stattdessen bedarf es lediglich dreier einfacher Annahmen:

Im Outdoorbereich ist die Helligkeit maximal, sofern man auf die Darstellung etwaiger Schatten verzichtet.In den Innenräumen – ob es sich dabei um Gebäude oder Höhlen handelt, spielt keine Rolle – ist die Helligkeit minimal, sofern der Lichteinfall von allen Seiten blockiert wird.Sollte der Lichteinfall nicht vollständig blockiert sein, nimmt die Lichtintensität mit zuneh...

Entwickler Magazin
Teil 3: Einführung in die prozedurale Landschaftsgestal- tung

Landschaftsgärtnerei in Minecraft-Welten

Im letzten Teil dieser Artikelserie haben wir uns damit befasst, wie sich Minecraft-Welten dank moderner OpenGL-Rendering-Techniken ruckelfrei darstellen lassen und wie man die im Vorfeld erforderlichen Berechnungsschritte auf mehrere Worker-Threads verteilen kann. Nun werden wir uns mit den Grundlagen der prozeduralen Landschaftsgestaltung auseinandersetzen und in diesem Zusammenhang die Geheimnisse des Tile-basierten Texture Mappings, der Zufallszahlen und Noise-Berechnungen (Rauschen) enthüllen.

Alexander Rudolph


Eines haben die letzten beiden Artikel zweifelsohne gezeigt: man sollte sich durch die Schlichtheit und den gewöhnungsbedürftigen Anblick eines durch Minecraft inspirierten Spiels nicht täuschen lassen. Die Herausforderungen hinsichtlich der Speicherverwaltung, des Renderings sowie der zugehörigen Programmabläufe sind nicht zu unterschätzen. Nachdem wir im ersten Teil unserer kleinen Minecraft-Serie die theoretische Vorarbeit geleistet haben, sind wir im zweiten Artikel auf die wichtigsten Programmabläufe in unserer „kleinen“ Demoanwendung zu sprechen gekommen. Dort haben wir gezeigt, wie sich blockbasierte Spielewelten dank moderner OpenGL-Rendering-Techniken effizient und ruckelfrei darstellen lassen, und haben demonstriert, wie man die im Vorfeld erforderlichen Berechnungsschritte auf mehrere Worker-Threads verteilen kann. Zur Vermeidung potenzieller Speicherprobleme haben wir uns dazu entschlossen, die komplette Spielewelt in lauflängenkodierter Form im Speicher zu verwalten. Bedenken Sie, dass bereits eine verhältnismäßig kleine Minecraft-Welt mit einer quadratischen Ausdehnung von 3 000 Metern und einer Höhe von nur 256 Metern genügend Raum für 2,304 Milliarden Blöcke mit einer Kantenlänge von jeweils einem Meter (3 000*3 000*2 56 = 2 304 000 000) bietet. Würde man nun für die Beschreibung der jeweiligen Blockeigenschaften auf eine 1-Byte-Variable vom Datentyp unsigned __int8 zurückgreifen (die Position eines Blocks in der Spielewelt ergibt sich aus der Position im zugehörigen unsigned __int8-Array), entspräche dies einem Gesamtspeicherbedarf von 2,304 GB. Lediglich der darzustellende Bereich, der vom Spieler nach Belieben umgestaltet werden kann (hierbei greifen wir auf ein Ray-Casting-Verfahren zurück), wird in unkomprimierter Form im Speicher gehalten.

Im zweiten Artikel haben Sie darüber hinaus ein einfaches Verfahren kennengelernt, mit dessen Hilfe man die Lichtausbreitung in einer blockbasierten Welt auch ohne umfangreiche mathematische Berechnungen oder komplizierte physikalische Theorien auf der CPU simulieren kann. Stattdessen bedarf es lediglich dreier einfacher Annahmen:

Im Outdoorbereich ist die Helligkeit maximal, sofern man auf die Darstellung etwaiger Schatten verzichtet.In den Innenräumen – ob es sich dabei um Gebäude oder Höhlen handelt, spielt keine Rolle – ist die Helligkeit minimal, sofern der Lichteinfall von allen Seiten blockiert wird.Sollte der Lichteinfall nicht vollständig blockiert sein, nimmt die Lichtintensität mit zuneh...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang