Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Apr 24, 2024 06:34

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Di Aug 18, 2015 14:10 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja, es ist definitiv nicht so ganz einfach einzurichten.

Allerdings stimmt es nicht, dass es Mehraufwand für die CPU bedeutet. Man kann die Index Buffer ohne Probleme vorher erstellen und dann fällt keine Rechenarbeit mehr zur Laufzeit an. (Und selbst wenn, wäre es jetzt nicht so tragisch ein paar tausend Integerwerte in einer bestimmten Reihenfolge zu schreiben.)

Die Normalen berechne ich übrigens vorher in einem Fragment Shader in eine Textur(Und Framebuffer Object). Die Höhendaten mache ich dem Fragment Shader über ein Texture Buffer Object verfügbar. Mit Compute Shadern und Storage Buffern würde das bestimmt besser gehen, aber ich wollte erstmal kompatibel mit OpenGL 3.3 bleiben. Ein generelles Problem ist auch, dass die Chunks sich um zwei Vertices überschneiden müssen, damit die Randdaten auf beiden Seiten verfügbar sind. Außerdem gibt es sonst Probleme bei der Berechnung der Normalen.

Zur Performance kann ich leider wenig sagen, weil ich bisher noch keine andere Technik probiert habe.
Es geht auf jeden Fall einige 10 Millionen Dreiecke damit auf meinerr GTX 760 flüssig darzustellen. (ohne LOD natürlich)
Ich glaube nicht das man mit Tesselation so viel schaft. Ich weiß es natürlich nicht sicher.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 18, 2015 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
OpenglerF hat geschrieben:
Ich habe bei meinen Terrainrenderer auch überlegt Tesselation zu nutzen, wenn es verhanden ist. Nach etwas überlegen kam ich aber zu dem Entschluss, dass man mit etwas mehr Arbeit eigentlich den selben Effekt selber hinbekommt (allerdings keine Planetenansicht). Die Höhen-/Texturinformation befindet sich in einem Vertex Buffer. Die X und Z Koordinate wird nicht gespeichert sondern im Shader aus der gl_VertexID erzeugt. Ich rendere mein Terrein in 256² Chunks die sich alle den selben Indexbuffer teilen. Darin befindet sich ein optimiertes Triangle Strip mit 16 Bit Indices. Für LOD tausche ich einfach nur den Index Buffer auf einem, der weniger auflöst ist und Vertices überspringt. Durch die Caching-Geschichte wäre es vielleicht auch noch eine Idee, dass man zu interpolierten Vertexdaten zugreift, weil die dann kontinuierlich vorliegen würden. Den Übergang zwischen den LOD-Stufen erreiche ich mit Index Buffern die ein Netz enthalten, das auf einer Seite enger wird.

Die Idee gefällt mir, ich hatte mit gl_VertexID und der erzeugung von x/z aus dieser(y und morph aus dem vbo) rum gespielt aber musste das ganze verwerfen, weil nur vbo's mit ibo's von der Engine supported wurden und sobald ein ibo ins spiel kommt funktioniert gl_VertexID nicht mehr wie gewollt. Man bekommt dann den index als id und nicht eine hochzählende Vertex ID.

Das find ich an Terrain Rendering so toll, es gibt mehr Möglichkeiten als man Zeit hat sie aus zu probieren ^^

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 18, 2015 14:36 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also ich bekomme auch den Index des Vertices als VertexID und nicht die tatsächlich den Index des Indices. Ich denke das macht deshalb Sinn, weil nur so der Vertex für verschiedene Indices im Post Transform Cache wiederverwendet werden kann.

Für mich jedenfalls ist das auch so perfekt, weil die Vertices ja genau dem Gitter folgen. Die X-Koordinate bekomment man mit "(gl_VertexID & 0xff) + ChunkX" und die Z-Koordinate mit "(gl_VertexID >> 8) + ChunkZ". Würde dagegen der Wert dagegen für jeden Index im Indexbuffer hochgezählt, würde das mit meinen in kleinen Schlangen verlegten Triangle Strip(das mache auch ich wegen dem Post Transform Cache) und den Unregelmäßigkeiten im Gitter bei LOD extrem komplex werden.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 35 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.107s | 17 Queries | GZIP : On ]