Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.02.2015, 13:25

Voxel erstellen C++/SDL2/OpenGL

Hallo

Seit einiger Zeit bzw seit ein paar tagen möchte ich ganz gerne mal was
mit "Voxel" darstellen -> sprich wie in MineCraft.

-Nur eine einfabige 10x10x10 landschafft mehr nicht - (nicht schonwieder ein neuer mincraft clone :D keine Angst)

Es gibt da so eine Seite names: https://sites.google.com/site/letsmakeavoxelengine/
Hier wird eigentlich fast alles erklärt wie sowas aufgebaut ist.

-da aber mein Englisch nicht so fachbezogen ist
möchte folgendes wissen:

soweit ich das jetzt verstanden habe, ist ein Voxel ein pixel mit volumen -
und damit man viele darstellen kann benötigt man ein VBO-Render


Wenn ich aber jetzt hingehe und ein Würfel mit einer For-Schleife in OpenGL darstelle dann ist so nach ein paar (30-40) schluss.. es ruckelt #

wie funktioniert dass mit dem VBO Render?

so ?
wird dieser Voxel (3d-würfel) nur einseitig zur kamera dagestellt ?
(sprich: wenn man von vorne draufguckt werden die seiten des würfels ausgeschaltet oder so ähnlich und wenn hintersich schaut werden die von vorne auch wieder ausgeschaltet)
so können dann sehr (sehr) viele Würfel hinter einander mit ganz wenig rechenzeit gerendert werden ?

- lange zahlen/nummern werden dann zu einer .. (das müsste was mit den "Voxel" zutun haben - ich glaub: 10x10x10 voxels = 1 Chunk)

______________________________________________________________________________________
mit SDL und C++ hab ich mittlerweile ein bisschen erfahrung und kann auch kleine spiele in 2d erstellen
in OpenGL lese ich mich auch mittlerweile ein und habe erfolge mithilfe von video-tutorials/google

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Patty1991« (13.02.2015, 13:39)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

13.02.2015, 14:18

wie funktioniert dass mit dem VBO Render?

Um vernünftige Performance zu erzielen packt man möglichst viele Vertexdaten in einen Buffer, schickt diesen einmalig an die Grafikkarte und lässt diesen dann immer wieder zeichnen wenn es benötigt wird. Sowohl Datenübertragung als auch Drawcalls kosten zeit, weswegen dein Versuch wohl so langsam wird, wenn du einfach jedes Frame die Daten sendest und/oder für jeden Würfel ein Drawcall aufrufst.


wird dieser Voxel (3d-würfel) nur einseitig zur kamera dagestellt ?

Ja, bei eingeschalteten Backface Culling zeichnet die Grafikkarte nur Vertizes die zur Kamera zeigen. Ändert aber nichts daran, dass die Vertizes durch den ersten Teil der Grafikpipeline gehen. Ist aber meistens weniger relevant.

so können dann sehr (sehr) viele Würfel hinter einander mit ganz wenig rechenzeit gerendert werden ?

Hintereinander ist etwas anderes. Die Vertizes weiter hinten zeigen trotzdem zur Kamera, werden also gezeichnet und hinterher überlagert bzw. per depth testing ignoriert.

- lange zahlen/nummern werden dann zu einer .. (das müsste was mit den "Voxel" zutun haben - ich glaub: 10x10x10 voxels = 1 Chunk)

Es macht Sinn nicht jeden einzelnen Wüfel zu betrachten, sondern eine Menge nebeneinanderliegende. Gleiche Seitenlängen machen es da einfacher. Was für Werte man nimmt ist erstmal ziemlich egal bzw. muss abgewägt/getestet werden zwischen Verwaltungsaufwand und Renderingaufwand.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

3

24.02.2015, 20:00

Ich beschäftige mich zurzeit mit einem Voxelspiel, dass ähnlich wie Minecraft inzwischen verschiedene Block-Modelle unterstützt. Um die Blöcke miteinander interagieren zu lassen und um schon vorher zu schauen, was gerendert werden muss, bekommt JEDER Block 6 Zeiger, auf die Nachbarblöcke. Die an den Rändern sind dann einfach 0. Nun gehe ich zu Beginn jeden Block einmal durch und jeder schaut, ob er bestimmte Seiten nicht zeichnen muss, weil sie von einem Nachbarblock verdeckt werden. Die übrigen Vertices und Indices werden returnt und in einen Vertex- und Indexbuffer gepackt.

Wenn sich nun ein Block ändert, dann werden einfach dieser und die 6 umliegenden geupdated und die beiden Buffer neu gefüllt. Dabei werden natürlich die von den Blöcken gespeicherten Daten benutzt. Um die Maps dynamisch nachladen zu können, wird die gesamte Map in Chunks eingeteilt. Da ists mit den Nachbarn natürlich ein bisschen schwieriger, aber auch dafür habe ich eine sehr schnelle Lösung gefunden. Wenns dich interessiert, dann sag bescheid. ;)

Nun kann man in jedem Frame die Buffer der Chunks zeichnen lassen, die nun wirklich nur den Teil der Geometrie beinhalten, der von außen zu sehen ist. Mit Culling kannst du wie von meinem Vorredner schon geschrieben, das ganze nochmals beschleunigen.

Ich hoffe, ich konnte dir noch ein wenig Denkanstöße geben - auch wenns ein bisschen spät ist. ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

25.02.2015, 17:26

Interessanter Artikel zum Thema. Das sind durch aus einige nützliche Schlagwörter dabei, wie Instancing.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Werbeanzeige