Ich versuche, eine kleine Voxel-Engine zu schreiben, weil es Spaß macht, aber ich habe Mühe, den besten Weg zu finden, um die tatsächlichen Voxel zu speichern. Ich bin mir bewusst, dass ich Blöcke benötigen werde, damit ich nicht die ganze Welt im Gedächtnis haben muss, und ich bin mir bewusst, dass ich sie mit angemessener Leistung rendern muss.
Ich lese über Oktrees und nach meinem Verständnis beginnt es mit 1 Würfel, und in diesem Würfel können 8 weitere Würfel sein, und in all diesen 8 Würfeln können weitere 8 Würfel usw. sein. Aber ich denke nicht, dass dies zu meiner Voxel-Engine passt, weil Meine Voxelwürfel / -gegenstände haben alle genau die gleiche Größe.
Eine andere Möglichkeit besteht darin, einfach ein Array mit einer Größe von 16 * 16 * 16 zu erstellen und dies zu einem Block zu machen, und Sie füllen es mit Elementen. Und Teile, in denen keine Elemente vorhanden sind, haben den Wert 0 (0 = Luft). Aber ich fürchte, das wird viel Speicher verschwenden und nicht sehr schnell sein.
Eine andere Option ist ein Vektor für jeden Block, und füllen Sie ihn mit Würfeln. Und der Würfel hält seine Position im Stück. Dies spart Speicher (keine Luftblöcke), verlangsamt jedoch die Suche nach einem Würfel an einer bestimmten Stelle erheblich.
Ich kann also keine wirklich gute Lösung finden und hoffe, dass mir jemand dabei helfen kann. Was würden Sie verwenden und warum?
Ein weiteres Problem ist das Rendern. Es ist einfach, aber sehr langsam, jeden Block zu lesen und ihn mit OpenGL an die GPU zu senden. Es wäre besser, ein Netz pro Block zu generieren, aber das bedeutet, dass ich jedes Mal, wenn ich einen Block breche, den gesamten Block neu erstellen muss, was einige Zeit in Anspruch nehmen kann und einen kleinen, aber spürbaren Schluckauf verursacht, den ich natürlich auch nicht möchte. Das wäre also schwieriger. Wie würde ich die Würfel rendern? Erstellen Sie einfach alle Cubes in einem Vertex-Puffer pro Chunk und rendern Sie das. Versuchen Sie vielleicht, das in einen anderen Thread einzufügen, oder gibt es einen anderen Weg?
Vielen Dank!