Wenn die Szene nicht vollständig in den Speicher passt, betreten Sie das Feld des Out-of-Core-Renderings. Hier gibt es im Wesentlichen zwei Ansätze: a) Generieren Sie Ihre Szene bei Bedarf. B) Laden Sie Ihre Szene bei Bedarf
Der erstere Ansatz passt gut zu den meisten Animationsworkflows, bei denen Modelle beispielsweise mit Catmull-Clark stark unterteilt sind und sehr speicherintensiv werden können, die Basisnetze selbst jedoch leicht in den Speicher passen. Pixar hat einige Artikel dazu (z. B. Ray Differentials und Multiresolution Geometry Caching für die Verteilung von Verteilungsstrahlen in komplexen Szenen ), aber das Wesentliche ist, dass Modelle nur dann unterteilt werden, wenn sie von einem Strahl getroffen werden, und nur so weit unterteilt werden, wie sie sind angemessen für einen solchen Strahl (z. B. diffuse Interreflexion erfordern weniger Genauigkeit als Spiegelreflexionen). Der Rest wird von einem Geometrie-Cache erledigt, der die unterteilten Modelle im Speicher hält und den Prozess hoffentlich durch eine gute Räumungsstrategie effizient macht.
Solange alle Ihre Basisnetze bequem in den Speicher passen, können Sie leicht aus dem Kern herausgehen und Netze auf Unterteilungsebenen rendern, die niemals in den Speicher passen würden. Der Geometrie-Cache lässt sich auch gut mit dem verfügbaren Speicher skalieren, sodass Sie RAM und Renderzeiten abwägen können. Dies wurde auch in Autos verwendet, glaube ich.
Der zweite Ansatz ist allgemeiner und beruht nicht auf einer starken Verwendung der Unterteilung. Stattdessen beruht es auf der Tatsache, dass Ihre Szene höchstwahrscheinlich von einem Künstler erstellt wurde und bereits in relativ kleine Objekte unterteilt ist, die individuell in das Gedächtnis passen. Die Idee ist dann, zwei Hierarchien beizubehalten (kD-Baum- oder Begrenzungsvolumenhierarchie): Eine Hierarchie der obersten Ebene, in der nur Begrenzungsrahmen der Objekte in Ihrer Szene gespeichert sind, und eine Hierarchie auf niedriger Ebene, in der die tatsächliche Geometrie gespeichert ist. Für jedes Objekt gibt es eine solche Hierarchie auf niedriger Ebene.
Bei diesem Ansatz speichern Sie idealerweise bereits einen Begrenzungsrahmen zusammen mit jedem Objekt auf der Festplatte. Während die Szene geladen wird, erstellen Sie zunächst nur die Hierarchie der obersten Ebene, dh Sie müssen nur die Begrenzungsrahmen und nicht die Geometrie betrachten. Anschließend verfolgen Sie die Strahlen und durchlaufen sie durch die Hierarchie. Immer wenn ein Strahl auf einen Blattknoten in der Hierarchie der obersten Ebene trifft (dh auf den Begrenzungsrahmen eines Objekts trifft), wird dieses Objekt in den Speicher geladen und seine Hierarchie auf niedriger Ebene erstellt. Der Strahl fährt dann fort, dieses Objekt zu verfolgen. In Kombination mit einem Objektcache, der so viel wie möglich von der Hierarchie auf niedriger Ebene im Speicher behält, kann dies eine recht gute Leistung erbringen.
Der erste Vorteil eines solchen Ansatzes besteht darin, dass Objekte, die niemals getroffen werden, niemals geladen werden, was bedeutet, dass sie sich automatisch an die Sichtbarkeit in Ihrer Szene anpassen. Der zweite Vorteil ist, dass Sie, wenn Sie viele Strahlen verfolgen, ein Objekt nicht sofort laden müssen, da es von einem Strahl getroffen wird. Stattdessen können Sie diesen Strahl halten und warten, bis genügend Strahlen auf dieses Objekt getroffen haben, wodurch sich die Last über mehrere Strahlentreffer amortisiert.
Sie können diesen Ansatz auch mit einem Strahlensortierungsalgorithmus wie " Sortierte verzögerte Schattierung" für die Verfolgung von Produktionspfaden kombinieren , um ein Verprügeln aufgrund inkohärenter Strahlen zu vermeiden. Das erwähnte Papier beschreibt die Architektur von Disneys Hyperion-Renderer, der meiner Meinung nach für Big Hero 6 verwendet wird, sodass er höchstwahrscheinlich Szenen im Produktionsmaßstab verarbeiten kann.