Ich arbeite gerade an der Aktualisierung und Umstrukturierung einer OpenGL-Render-Engine. Die Engine wird verwendet, um große Szenen von architektonischen Daten (Gebäude mit Innenräumen) zu visualisieren, und die Anzahl von Objekten kann ziemlich groß werden. Wie bei jedem Gebäude gibt es viele eingeschlossene Objekte in Wänden, und Sie sehen natürlich nur die Objekte, die sich im selben Raum befinden wie Sie, oder das Äußere, wenn Sie sich auf der Außenseite befinden. Dies hinterlässt eine große Anzahl von Objekten, die durch Okklusions-Culling und Frustum-Culling verschlossen werden sollten.
Gleichzeitig gibt es viele Wiederholungsgeometrien, die in Render-Batches zusammengefasst werden können, sowie viele Objekte, die mit instanziertem Rendering gerendert werden können.
Wie ich es sehe, kann es schwierig sein, Renderbatching und Culling auf optimale Weise zu kombinieren. Wenn Sie zu viele Objekte in derselben VBO ablegen, ist es schwierig, die Objekte auf der CPU zu entfernen, um das Rendern des Stapels zu überspringen. Zur gleichen Zeit, wenn Sie die Culling auf der CPU überspringen, werden viele Objekte von der GPU verarbeitet, während sie nicht sichtbar sind. Wenn Sie das Batching einfach überspringen, um einfacher auf der CPU zu cullen, wird es eine ungewollte Menge an Renderaufrufen geben.
Ich habe einige existierende Techniken und Theorien erforscht, wie diese Probleme in modernen Grafiken gelöst werden, aber ich konnte keine konkrete Lösung finden. Eine Idee, die ein Kollege und ich uns ausgedacht hatten, war die Beschränkung von Chargen auf Objekte, die relativ nahe beieinander lagen, z. B. alle Stühle in einem Raum oder in einem Radius von n Meetern. Dies könnte durch Verwendung von Oktbäumen vereinfacht und optimiert werden.
Hat jemand irgendwelche Hinweise auf Techniken, die für Szenenmanagement, Culling, Batching etc. in modernen Grafik-Engines verwendet werden?
Es gibt viele Informationen über Kegelstümpfe und Okklusion im Internet. Das meiste kommt von Spieleentwicklern. Hier ist eine Liste mit einigen Artikeln, die Sie zum Einstieg bringen werden:
Mein (ziemlich schneller) Renderer funktioniert ähnlich wie dieser:
Und als "Full Frontal Nacktheit" schon gesagt: Es gibt keine perfekte Lösung.
Tags und Links opengl culling batch-processing batching occlusion-culling