Benötigen Sie Beratung für 3D BSP-basierte Grafik-Engine [geschlossen]

8

Ich habe mir einen OpenGL BSP-Viewer für ein altes Spielformat codiert. Es ist dem Quake 3-Dateiformat sehr ähnlich. Da ich mich für die Entwicklung von Grafik-Engines interessiere, möchte ich mich unter Berücksichtigung der aktuellen Technologie weiterentwickeln. Deshalb wende ich mich an Sie, die Experten zu diesem Thema, um zu erfahren, worauf Sie sich konzentrieren sollen. Ich möchte, dass dies so schnell wie möglich geht und da die alten Dateiformate sehr einfach sind und nur wenige Polygone haben, denke ich, dass dies machbar sein sollte. Hier sind meine Fragen:

  1. Beleuchtung a. Ist es für mich sinnvoll, die Scheitelpunktbeleuchtung zu lernen, oder sollte ich stattdessen nur die Beleuchtung pro Pixel implementieren? b. Ich weiß, dass OpenGL eine Lichtgrenze von 8 hat. Sollte ich realistischerweise nur eines davon für Umgebungslicht und den Restcomputer über Shader verwenden? Wenn nicht, was soll ich tun?

  2. Sortieren / Keulen a. Was ist der am schnellsten verwendete Algorithmus zum Sortieren von zu rendernden Oberflächen? Komplexität ist nicht wirklich ein Problem. Ich möchte lernen, was gerade verwendet wird und wie ich wirklich nur die Dinge rendern kann, die ich sehen kann. Ich habe eine Reihe von Algorithmen gesehen, die wie der Algorithmus des Malers beschrieben wurden, und frage mich, was für BSP-basierte Geometrie am sinnvollsten ist. b. Wenn ich Texturen mit Alpha-Masken habe, wurde mir gesagt, dass das Sortieren in irgendeiner Weise mit diesem Prozess verbunden ist. Wie erlaube ich ihnen, im 3D-Raum korrekt zu rendern?

  3. Grafik-Pipeline a. Soll ich meine Geometriedaten über VBOs senden? Ist dies der heute verwendete Standard? b. Wenn ich eine Reihe von "Regionen" habe, möglicherweise 200-300, sollte ich einen besseren Weg finden, sie an die GPU zu senden, ohne 200-300 Chunks zu senden. Sollte ich sie zu einer kombinieren und jedem eine Referenz zuordnen?

Gibt es noch andere Tipps für BSP-basiertes Rendering und ähnliches?

Wenn ich etwas Falsches gesagt habe, korrigieren Sie mich bitte. Ich bin diese Person, die lieber korrigiert und etwas verlegen wäre als unwissend und ahnungslos.

Vielen Dank für Ihre Zeit. Ich weiß das wirklich zu schätzen.

Satchmo Brown
quelle
Planen Sie, alle Dreiecke Ihrer Szene in das BSP einzufügen, auch dynamische wie animierte Charaktere oder sich bewegende Objekte? Ein BSP ist nicht sehr gut, wenn es um dynamische Objekte geht.
Maik Semder
Sie haben im Moment keine Zeit für einen vollständigen Kommentar, aber besuchen Sie icculus.org/twilight/darkplaces/technotes.html und zögern Sie nicht, auf #darkplaces auf irc.anynet.org zu hüpfen und LordHavoc / anderen Ihre Fragen zu stellen .
user_123abc

Antworten:

1

Wenn Sie - wie Sie sagen - an aktueller Technologie interessiert sind:

1) Beleuchtung: Auf jeden Fall Beleuchtung pro Pixel. Wenn Sie sich das Rendern der aktuellen Generation ansehen möchten, müssen Sie Vertex- und Pixelhader schreiben. So einfach ist das. Sie bieten nahezu unbegrenzte Flexibilität und sind nicht viel schwieriger zu verwenden als die Pipeline mit festen Funktionen, wenn Sie anfangen, sie richtig zu lernen. Die 8-Licht-Grenze von OpenGL gilt nur für altmodische Pipeline-Setups mit festen Funktionen. Gehen Sie nicht diesen Weg, lernen Sie OpenGL Core und vergessen Sie all das datierte glBegin / glEnd-Zeug.

2) Sortieren / Keulen: Zu Beginn: Nur sortieren, wenn dies für Transparenz erforderlich ist. Nur Objekte aussortieren, die sich außerhalb des Sichtstumpfes befinden.

3) Wenn Sie OpenGL verwenden, verwenden Sie VBOs und VAOs.

- -

Ungefragt: Wenn Sie einen Viewer für ein altmodisches BSP-Format erstellen (ich vermute etwas von einer Ventil- / ID-Engine?), Sollten Sie in der Lage sein, das gesamte Level ohne jegliche Optimierung (Culling / BSP) zu zeichnen ) überhaupt und immer noch volle Framerate auf moderner Hardware bekommen;)

OpenGL-Tipp: Holen Sie sich die OpenGL Superbible 5th Edition. Dies bringt Ihnen bei, wie man modernes OpenGL macht, und trübt Ihren Geist nicht mit Dingen, von denen Sie später herausfinden werden, dass sie veraltet sind.

Lennart Denninger
quelle
-3

1.a Per-Vertex-Beleuchtung ist einfacher als Per-Pixel-Beleuchtung (Per-Vertex-Beleuchtung ist in OpenGL integriert, Perpixel-Beleuchtung erfordert einen benutzerdefinierten Shader).

1.b Wenn Sie acht Lichter haben, verwenden Sie sie! Sie müssen jedoch berechnen, welche Lichter sichtbar sind.

3.a Verwenden Sie VBOS. Verwenden Sie niemals glBegin / glEnd (es sei denn, Sie verwenden Anzeigelisten, aber in Ihrer Situation sind VBOs die bessere Lösung).

3.b Sie sollten sich keine Sorgen um die Leistung machen, während sich das Programm noch in der Entwicklung befindet. Besonders mit heutiger Hardware. Senden Sie also Ihre 200-300 Brocken aus.

Ich kenne BSP-Karten nicht gut genug, um Ihnen bei Ihren anderen Fragen zu helfen.

Raphael R.
quelle
3
-1 für 3.b. Ich hasse das Mantra "Mach dir keine Sorgen um die Leistung", das falsch auf alles angewendet wird. Es hat seinen Platz, da es nicht 50% der Entwicklungszeit darauf verwendet, etwas 2% schneller laufen zu lassen. Beim Entwurf größerer Systeme ist es jedoch gut, einen effizienten Plan zu haben. Daten, die in 200-300 Blöcken an die GPU gesendet werden, führen möglicherweise dazu, dass die CPU und die GPU unnötig härter arbeiten, als wenn alles als ein Block gesendet würde.
AttackingHobo
@AttackingHobo +1
Jonathan Connell