Octree-Rendering optimieren

7

Angenommen, ich habe einen Octree und auf einer bestimmten Ebene speichere ich VBOs in diesem Octree. Ich kenne die Abmessungen der Knoten, denen das vbo gehört, damit ich grundlegende Kegelstumpf-Keulungen durchführen kann. Das funktioniert gut, weil alles außerhalb des Bildschirms nie gerendert wird.

Meine Welt ist jedoch ziemlich groß und ich zeichne derzeit auch Dinge hinter bereits gezeichneten Oktrees. Was würde ich verwenden, um keine Knoten zu zeichnen, die von anderen Knoten verdeckt werden, und wie würde ich das tun?

Ich habe einige Erwähnungen von Okklusions-Keulung in der OpenGL-Superbible gesehen, aber ich sehe nicht, wie ich das nutzen kann, wenn ich keine klare Unterscheidung zwischen Okkludern und Okkludenten habe.

Armin Ronacher
quelle
1
Wenn der Inhalt eines Knotens einen Knoten nicht unbedingt vollständig ausfüllt, kann ich nicht sehen, wie Sie Ihren Octree für die Okklusion verwenden können
CiscoIPPhone
Sie können den Octree-Inhalt als Okkluder und die Octree-Knoten als Okklude verwenden. Die aggregierte Pixelabdeckung mehrerer teilweise gefüllter Knoten (dh teilweise, da sie nicht dem vollständigen Pixel-Footprint des Octree-Knotenwürfels zugeordnet ist) kann leicht einen großen Okkluder bilden, und dies kann Octree-Knoten blockieren, die weiter von der entfernt sind Kamera.
Crowley9

Antworten:

6

Eines der Merkmale des Octree ist, dass Sie Ihre Octree-Knoten in der Reihenfolge von vorne nach hinten rendern können. Wenn Sie dies tun, wird die Leistung erheblich verbessert, da die EarlyZ-Implementierung der Grafikhardware effektiver ist (Sie führen weniger Shader aus, erledigen weniger Rasterarbeiten usw.).

Der Vorteil der Verwendung von Okklusionsabfragen zum Abfragen der Sichtbarkeit von Octree-Knoten besteht darin, dass Sie nicht gerenderte hochkomplexe geometrische Objekte rendern können. Die (undurchsichtigen) Objekte in Ihrer Szene sind Ihre Okkluder, und Ihre Octree-Knoten (und implizit deren Inhalt) sind Okkludees. Wie Samaursa sagte, ist es wirklich schwierig, dies richtig zu machen. Lesen Sie daher bitte dieses Papier, bevor Sie es versuchen (Stände beeinträchtigen die Leistung, wenn sie nicht sorgfältig behandelt werden). Stellen Sie außerdem sicher, dass die geometrische Komplexität tatsächlich Ihr Leistungsbegrenzer ist, da Sie sonst wahrscheinlich Ihre Zeit verschwenden werden.

Crowley9
quelle
2

OpenGL unterstützt nativ keine Okklusionsabfragen, Sie können jedoch Erweiterungen wie ARB_occlusion_query verwenden . Der Link hat ein Projekt und ein schönes PDF, das erklärt, wie man es benutzt. Seien Sie jedoch vorsichtig, manchmal sind die Okklusionsabfragen teurer als das einfache Zeichnen der Geometrie. Dies gilt insbesondere dann, wenn Ihre Geometrie nicht sehr komplex ist.

Wenn Sie mehr Informationen zu Ihrer Szene bereitstellen (Screenshot), könnte eine bessere Lösung bereitgestellt werden.

Samaursa
quelle
0

Ich habe gerade meine VBOS nach Entfernung zur Kamera bestellt. Dies scheint am meisten zu helfen. Wenn ich Okklusionsabfragen nicht verstehe, verlangsamt dies meinen Code und liefert seltsame Ergebnisse, anstatt tatsächlich zu helfen. Wenn ich also unterwegs keine weiteren Leistungsprobleme sehe, bleibe ich bei dem, was ich habe.

Armin Ronacher
quelle
Gute Idee. :-) Vielleicht möchten Sie sich mit Prädikat-Okklusionsabfragen befassen (erforderlich für DX10-Hardware, und ich gehe davon aus, dass es eine OGL-Erweiterung gibt). Die Prädikation kann dazu beitragen, Verzögerungen zu vermeiden und einen Großteil der Nachteile zu beseitigen. Auch hier ist die Hauptmotivation, wenn Sie Millionen von Dreiecken pro Frame rendern.
Crowley9