Sollte ich Debug-Grundelemente für das Rendern in modernem OpenGL stapeln?

7

Ich habe kürzlich begonnen, einige alte Rendering-Demos, die ich gemacht habe, auf modernes OpenGL zu portieren. Ich hatte eine Debug-Zeichenklasse in meinem alten Code, die den Sofortmodus glBegin (), glEnd () usw. zum Rendern von Debug-Objekten wie Dreiecken, Würfeln und Kugeln usw. verwendete.

Ursprünglich habe ich den Code in diesen Funktionen durch Code ersetzt, um VAO und VBOs (für Position und Farbe) zu generieren, sie zu binden, die Scheitelpunktdaten zuzuweisen, zu rendern, dann die VBOs und VAO zu rendern, dann zu deaktivieren und zu löschen. Ist daran etwas falsch?

Ich habe darüber nachgedacht, die Klasse so zu ändern, dass sie jedes Mal, wenn sie einen primitiven Draw-Aufruf erhält, VAO und VBOs generiert und die Scheitelpunktdaten zuweist, das Rendering jedoch erst dann ausführt, wenn alle anderen Renderings abgeschlossen sind. Anschließend werden alle gespeicherten Debug-Prims gleichzeitig gerendert.

Ich bin mir nicht sicher, welche Vorteile dies bietet, und habe mich nur gefragt, was die Leute gedacht haben.

user10329
quelle

Antworten:

7

Wenn Sie Debug-Zeichnungen erstellen, sollte die Leistung nicht Ihr Hauptanliegen sein. Es ist viel wichtiger, es zum Laufen zu bringen. Schließlich werden Sie dieses Zeug nicht in Release-Builds verwenden. Was macht es also aus?

Wenn Sie jedoch an einer Möglichkeit interessiert sind, schlägt diese Seite zum Pufferobjekt-Streaming Möglichkeiten zur Verbesserung der Leistung für manuell generierte Scheitelpunktdaten vor. Achten Sie besonders auf die Methode "Buffer Update".

Nicol Bolas
quelle
1

Ob Sie den Sofortmodus oder VBOs verwenden möchten, hängt von der Komplexität der Szene ab. Ich habe einige Beispiele gesehen, bei denen Tangenten- / Normalenlinien im Sofortmodus gezeichnet werden.

Es ist nichts Falsches daran, VBOs zum Debuggen zu verwenden. Beachten Sie jedoch, dass das Stapeln im Allgemeinen Leistungsvorteile bietet, unabhängig davon, welchen Ansatz Sie verwenden. Versuchen Sie daher immer, ihn zu verwenden, wann immer dies möglich ist. Sie können immer noch viel von der Stapelverarbeitung im Sofortmodus profitieren (möglicherweise sogar noch mehr), da dadurch die Anzahl der Statusänderungen erheblich reduziert wird. Bei ordnungsgemäßer Stapelung benötigen Sie immer nur einen GlBegin () und einen GlEnd (), und alle ähnlichen Daten sind eng gruppiert. Der einzige Unterschied besteht darin, dass Sie Statusaufrufe anstelle von Scheitelpunktdaten stapeln.

ChrisC
quelle
3
Ich möchte den Sofortmodus überhaupt nicht verwenden, da er veraltet ist. Momentan habe ich den Sofortmodus ersetzt, sodass bei einem Aufruf von DrawDebugCube () die Scheitelpunktpuffer erstellt, mit Daten gefüllt, gerendert und anschließend gelöscht werden. Ich denke daran, dass DrawDebugCube () nur die Puffer erstellt und sie auffüllt. Dann werden alle gepufferten Debug-Prims später auf einmal gerendert.
user10329