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

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

1

01.01.2014, 11:54

Terrain Rendering - mit VertexShader

Liebe Leser.

Ich will nun Terrain-Rendering in die Tribase Engine intrigieren. Ich habe nun damit begonnen die Tribase-Enginen klassen hinzuzufügrn für Open-World Spiele . Also Spiele wo man in einer Landschaft herumlaufen kann.

Jedoch frage ich mich, ob man das Terrain nicht im VertexShader erstellen kann.

Mann liest einen Pixel mit Tex2D und transformiert den Vertex auf den jeweiligen wert. Anderes geht das doch Garnichts. Oder gibt es auch in D3D ein Funktion wie Tex2D? Wie man das mit dem Quadtree macht erforsche ich noch in Google.

Gibt es vielleicht auch ein gutes Buch, das man sich besorgen kann, was diese fortgeschrittene Themen bearbeitet.

Wie klappt das mit der Kollisionen Erkennung mit der Landschaft? wenn der Spieler einen Berg hochläuft, soll er mit dem Terrain gehen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Sebastian Müller« (01.01.2014, 12:07)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.01.2014, 12:14

Jedoch frage ich mich, ob man das Terrain nicht im VertexShader erstellen kann.

Ja, kann man...

Mann liest einen Pixel mit Tex2D und transformiert den Vertex auf den jeweiligen wert.

Ja, genau so könnte man das machen...

Oder gibt es auch in D3D ein Funktion wie Tex2D?

Bin mir nicht sicher, was genau du damit meinst...

Wie klappt das mit der Kollisionen Erkennung mit der Landschaft? wenn der Spieler einen Berg hochläuft, soll er mit dem Terrain gehen.

Naja, es geht wohl um ein Terrain auf Basis einer Heighmap. In dem Fall kannst du ja die Höhe des Terrain an jedem Punkt bestimmen...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

01.01.2014, 12:23

Der Ansatz scheint auch laut meinen recherchen so ziemlich mit das aktuellste zu sein (dot, bitte korrigiere mich wenn ich falsch liege!). Der Trend geht bei Terrains stark auf die GPU, was durch Vertex-Texture Fetches ziemlich gut abgebildet wird. Interessant fand ich den Geometric Clipmaps Ansatz. Dummerweise habe ich ihn nicht 100% technisch verstanden, sonst hätte ich damit schon längst mal ein Terrain gebaut.
Was ich besonders gut an den Vertex-Texture-basierenden Lösungen finde: Verformung geht ziemlich einfach, in dem man aus der Heightmap eine dynamische Textur macht und sie beliebig zur Laufzeit anpassen kann. Das einzige was ich nicht abschätzen kann, wie sich das bei sehr großen Terrains mit mehreren Heightmaps verhält.

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

4

01.01.2014, 12:49

Wegen der Kollisionserkennung.

Mann könnte doch mit Hilfe der Highmap ein kollisionsmodell der Umgebung erstellen. oder?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

01.01.2014, 12:57

Ich bin ehrlich gesagt nicht wirklich über den aktuellen State of the Art im Terrain-Rendering informiert. Vector Displacement Maps scheinen mir atm wohl relativ populär (mich persönlich überzeugt das Prinzip ehrlich gesagt allerdings nicht). Aber ja, wenn man die Terraingeometrie nur zum Rendern braucht und rein auf der GPU arbeiten will, dann ist die Vertex-Texture-Fetch-basierte Lösung wohl immer noch aktuell. Heightmaps haben ihre Vorteile, sind allerdings doch auch beschränkt in ihren Möglichkeiten...

6

01.01.2014, 14:59

Naja, Kollisionserkennung hat eigentlich sehr wenig mit Rendern zu tun. Die Frage ist halt, wie genau die Kollisionserkennung implementiert ist. Man kann sicherlich eine schreiben, die mit Heightmaps arbeitet, aber auch wenn sie Dreiecksbasiert ist, kann man ja aus der Heightmap ein Mesh für die Kollisionsabfrage erstellen. Dieses Mesh muss ja überhaupt nichts damit zu tun haben, wie du die Landschaft renderst.

Und: Einfach ein Raster zu nehmen und die Vertexhöhen auf die Höhe aus einer Textur zu setzen macht irgendwie auch nur dann Sinn, wenn du die Vorteile ausnutzt, die sich daraus ergeben können. Denn ansonsten könntest du die Vertexe auch gleich auf die richtige Höhe setzen und würdest den Speicher für die Heightmap und die Rechenzeit für das Transformieren sparen.
Vorteile die mir spontan einfallen:
- Du kannst das selbe Raster für verschiedene Landschaftsabschnitte benutzen (wenn sie die gleiche Auflösung haben). Du musst also nur die Textur wechseln, behältst das Modell aber bei. Insgesamt dürfte das etwas Speicher sparen, weil du nicht jeden Eckpunkt immer mit 3 Koordinaten speichern musst.
- Du kannst leicht die Auflösung wechseln: Je nachdem, welches Raster du mit einer Textur zusammen benutzt, kannst du deine Landschaft mit unterschiedlichen Auflösungen rendern.
Lieber dumm fragen, als dumm bleiben!

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

7

02.01.2014, 10:30

Mir fält grade noch eine frage ein.

Das Terain was weiter weg ist, wird ja weniger Detail reich dargestellt, weil der Quadtree Knoten weit oben im Baum ist. Wie soll man die Vertices dort, die sehr Detail schwach sind mit der Highmap transformieren? Der Vertex past doch garnicht mehr in den Pixelraster der Map.

Kann man als grundmesh ein simples 3d Modell nehme? Also ein 20x20 Mesh. Dieses mird dann mit hilfe eins quadtrees in der nähe des Spielers aufgeteilt.

8

02.01.2014, 12:12

Na, die Heightmapt ist eine ganz normale Textur die gefiltert werden kann. Wenn Dreiecke kleiner dargestellt werden, als ihre Textur hätte man ja ansonsten genau das selbe Problem. Du nimmst also ein Mesh, das niedriger Aufgelöst ist, als die Heightmap, aber trotzdem passende Texturkoordinaten hat. Die Folge ist, dass dann eben nicht alle Texel berücksichtigt werden, aber das ist ja im Grunde gerade die Detailreduktion.

Und ja, du kannst als Mesh so ziemlich jedes 3d Modell nehmen. Der Vertex-Shader wird ja einfach nur die Z-Koordinate jedes Vertex auf die Höhe setzen, die er anhand der Texturkoordinate des selben Vertex aus der Heightmap gelesen hat. Das ist so zunächst einmal komplett unabhängig von der Geometrie des Modells, aber es machen natürlich nicht alle Modelle Sinn.
Ein gleichmäßiges Raster wäre halt das naheliegenste. Man könnte aber auch zum Rand hin entweder mehr oder weniger Vertexe haben, um besser einen sauberen Übergang zwischen verschiedenen Detailstufen zu erreichen.

Einen Quadtree brauchst du dabei nicht unbedingt, es liegt halt ein wenig daran, wie du es umsetzen möchtest.
Lieber dumm fragen, als dumm bleiben!

9

02.01.2014, 12:30

Ich hatte gerade noch eine interessante Idee. Nicht das ich mich wirklich intensiv mit Terrain Rendering beschäftigen würde, aber es klingt trotzdem ganz nett.


Die Grundidee ist ja, dass man in der Nähe der Kamera viele Details haben möchte, und im Hintergrund wenige. Dafür kann man eine große Heightmap in verschiedene Teile aufteilen, die jeweils in verschiedenen Detailstufen vorliegen. Je nachdem wie weit ein Teil von der Kamera entfernt ist, wird es dann mit mehr oder weniger Details gerendert.


Nehmen wir jetzt an, wir würden den Ansatz mit der Heightmap in der Textur, die im Vertexshader ausgelesen und als Höhe für die Vertexe benutzt wird. Wenn unser komplettes Terrain in eine einzige Textur passt, müsste folgendes funktionieren:

Man erstellt ein spezielles Raster (als Mesh), dass in der Mitte eine sehr hohe Dreiecksdichte hat, zum Rand hin aber eine geringe. Dieses Mesh rendert man jetzt immer an der Kameraposition, so dass automatisch in der Nähe der Kamera viele Dreiecke sind, in der Entfernung aber nur wenige. Durch einen passenden Offset (basierend auf der Kameraposition) verschiebt man beim Rendern aber die Texturkoordinaten, so dass immer der passende Teil der Landschaft dargestellt wird. Durch entsprechende Filtereinstellungen würde alles außerhalb des Terrains die Höhe 0 bekommen, also eine flache Ebene.
Dadurch wird das komplette Terrain-Rendering ziemlich simpel: Man muss nur noch ein Modell mit einer Textur rendern, hat aber trotzdem ein LOD-System und immer eine konstante Dreieckszahl, unabhängig von der Größe oder Auflösung des Terrains (entscheidend ist halt das Mesh, das man passend wählen muss). Damit die Vertexe nicht über das Terrain "schwimmen" muss man eventuell noch einen zusätzlichen Offset einbauen.

Ein paar Nachteile hat das ganze natürlich auch: Das LOD System ist darauf ausgelegt, dass die Kamera "auf" der Landschaft steht, für Flugsimulationen will man vermutlich andere Aufteilungen haben. Außerdem möchte man normalerweise in flachen Bereichen wenige, in detailreicheren Bereichen dagegen mehr Dreiecke haben (damit die Form von weit entfernten Bergen trotzdem noch gut wiedergegeben wird). Das wäre mit dieser Technik unmöglich, da sie ja gerade unabhängig vom konkreten Terrain sein soll.

Falls man Probleme mit der Texturgröße bekommt, wäre auch ein mehrstufiges System denkbar: Ein Terrain für die Nähe und eines für die Entfernung, das analog funktioniert, aber mit einer niedriger Aufgelösten Textur (die aber die selbe Größe hat und damit eine größere Landschaft abdecken kann).

Den Hauptvorteil sehe ich darin, dass man die beschriebene Technik sehr schnell (ein Nachmittag oder so) implementieren kann. Wenn man nicht richtig viel Zeit ins Terrain-Rendering investieren will, sondern einfach nur ein Terrain, das funktioniert, aber nicht unbedingt immer optimal ist, haben möchte, könnte das durchaus etwas sein.
Lieber dumm fragen, als dumm bleiben!

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

10

02.01.2014, 13:29

AHHHHHHHHH

Ich verstehe.

Man verschiebt nicht das Mesh, sondern die Highmap die die Vertitzen verschiebt. das Terrain würde so ohne quadtree auskommen, oder?.

Dass läst sich sehr leicht implementieren. Danke für die Gedanken Hilfen.

Werbeanzeige