StartseiteArtikel

Gerade hat Fei-Fei Li ihre neuesten Ergebnisse präsentiert. Jetzt kann auch ein Mobiltelefon eine 3D-Welt mit Hunderten von Millionen von Partikeln verarbeiten.

爱范儿2026-04-15 12:04
Eine Zeile von Links, die Welt verbinden.

Es ist kein neues Thema mehr, dass man mit einem Kreis von Fotos eine interaktive 3D-Welt generieren kann. Das Problem ist jedoch, wie man eine große Welt in den Browser eines normalen Smartphones packen kann.

Gerade eben hat World Labs, ein von Fei-Fei Li gegründetes KI-Weltmodell-Unternehmen, ein neues und quelloffenes Ergebnis veröffentlicht: Spark 2.0.

Dieser dynamische 3D-Gaußsche Punktwolken-Rendering-Engine (3DGS), speziell für die Webseite entwickelt, macht es möglich, dass riesige 3D-Szenen mit Hunderten von Millionen von Partikeln in jedem Browser reibungslos laufen. Dies wird allmählich zur Realität.

Warum ist es so schwierig, eine 3D-Welt mit Hunderten von Millionen von Partikeln auf ein Smartphone zu packen?

Vielleicht haben Sie von der "3D Gaussian Splatting" (3DGS) gehört. Mit einem Satz erklärt man es so: Es ist eine Technologie, die reale Szenen in interaktive 3D-Inhalte umwandelt. Man muss kein Modell erstellen, sondern kann einfach einen Kreis von Fotos machen, um die 3D-Welt zu generieren.

Im Gegensatz zur traditionellen 3D-Modellierung, die Dreiecksflächen verwendet, nutzt die 3DGS Millionen von halbtransparenten farbigen Ellipsoiden, von denen jedes ein "Splat" genannt wird.

Links wird ein texturiertes Dreiecksnetz verwendet, rechts Gauss-Splatter, um dasselbe Objekt zu rendern.

Jedes Splat ist kein einfacher Punkt, sondern ein Ellipsoid mit einer kompletten "Persönlichkeit". Es speichert seine Position im Raum, die Radien seiner drei Achsen, seine Orientierung, seinen RGB-Farbwert und seine Transparenz.

Das wichtigste Attribut ist die Transparenz. Sie bestimmt das Einflussgewicht des Splat beim Überlappen. Wenn man die räumliche Dichte eines einzelnen Splat zeichnet, erhält man eine Gauß-Kurve: Im Zentrum ist es am dichtesten, nach außen hin wird es allmählich verschwommen, und der Rand löst sich natürlich in den Hintergrund auf.

Genau diese Art des Überlappens mit "weichen Grenzen" lässt Millionen von Splats zusammenkommen, um die Körnung einer Ziegelmauer, die Lichtdurchlässigkeit von Blättern und die Reflexion von Glas darzustellen, anstatt ein plastikartiges Gefühl, das von harten Dreiecken erzeugt wird.

Das Ergebnis ist gut, und die Informationsmenge ist auch groß. Eine hochwertige 3DGS-Scanszene hat leicht Tausende von Millionen von Splats, und die Dateigröße kann leicht 1 GB überschreiten.

Dies bringt ein schwieriges Problem mit sich: Die Obergrenze, wie viele Splats ein normales Smartphone reibungslos rendern kann, liegt zwischen 1 und 5 Millionen, was eine ganze Größenordnung weniger ist als die 40 Millionen Splats einer hochwertigen Scan-Szene.

Aktuelle Renderer können auch nicht mehrere Scansobjekte in derselben Szene richtig rendern. Entweder kann nur ein einzelnes Objekt gerendert werden, oder die Reihenfolge wird durcheinander gebracht, und die Objekte "kleben" aufeinander, was ein Chaos ergibt.

Daher wurde Spark entwickelt. Laut der offiziellen Blog-Eintragung war Spark ursprünglich ein internes Werkzeug von World Labs. World Labs musste 3DGS-generierte Welten auf der Webseite präsentieren, aber alle Renderer auf dem Markt hatten Schwächen. Einige konnten nur einzelne Objekte rendern, andere waren auf WebGPU angewiesen (viele Geräte unterstützen es noch nicht), und einige unterstützten keine dynamischen Animationen.

Nach einigen Vergleichen beschlossen sie, einfach ihr eigenes zu bauen.

Als technologische Grundlage wählten sie THREE.js, das beliebteste 3D-Framework für das Web, das auf WebGL2 basiert und fast alle modernen Geräte abdeckt. Die Kern-Rendering-Logik besteht aus drei Schritten: Zunächst wird auf der GPU eine globale Splat-Liste für alle Objekte erstellt, dann werden sie von weit nach nah sortiert, und schließlich wird alles auf einmal gerendert.

"Globale Sortierung" klingt banal, ist aber der Schlüssel dafür, dass mehrere 3DGS-Objekte in derselben Szene koexistieren können, ohne ineinander zu greifen. Spark bietet außerdem eine GPU-Verarbeitungs-Pipeline an, mit der Benutzer jedes Splat neu einfärben, die Transparenz anpassen und dynamische Animationen erstellen können. Dies kann in GLSL programmiert oder wie in Blender über Knotendiagramme realisiert werden.

Die Version 1.0 hat das Problem des Renderings mehrerer Objekte gelöst, aber eine Szene mit 40 Millionen Splats war immer noch eine unüberwindbare Schwelle. Daher gibt es nun Spark 2.0.

Geräte immer nur die "ausreichende" Informationsmenge rendern lassen

Das Herzstück von Spark 2.0 ist eine Kombination aus drei Technologien: Level of Detail (LoD), progressives Streaming und virtueller Speichermanagement. Einzeln betrachtet gibt es für jede dieser Technologien Vorlagen, aber erst die Kombination aller drei ermöglicht es, eine Welt mit Hunderten von Millionen von Splats im Smartphone-Browser reibungslos zu rendern.

1. Kontinuierlicher LoD-Baum: Das gute Eisen an der richtigen Stelle einsetzen

LoD (Level of Detail) ist in der Spielebranche bereits ein etabliertes Konzept. Bäume in der Nähe werden mit Tausenden von Dreiecken modelliert, während Bäume in der Ferne nur aus einigen Dutzend bestehen. So wird die Rechenleistung effizient genutzt. Das Nanite-System von Unreal Engine basiert auf demselben Prinzip, indem es die Dreiecksdetails an die Blickweite anpasst und automatisch skaliert.

Spark 2.0 hat dasselbe Konzept auf die Splats übertragen und es noch weiter vorangetrieben.

Das diskrete Umschalten zwischen verschiedenen Versionen kann zu "Sprüngen" im Bild führen. Spark baut stattdessen einen kompletten "kontinuierlichen LoD-Baum", bei dem jeder innere Knoten eine approximative Version der fusionierten Splats seiner Kindknoten ist. Die Splats werden Schicht für Schicht nach oben zusammengeführt, bis sie schließlich am Wurzelknoten ankommen, der ein einzelnes Splat mit der gröbsten Auflösung für die gesamte Szene darstellt.

Beim Rendern teilt das System den Baum dynamisch anhand der aktuellen Ansicht. Der Bereich in der Nähe der Ansicht erhält die Details aus der untersten Ebene, während der fernere Bereich die gröbere Auflösung der oberen Ebenen bekommt.

Der gesamte Prozess wird durch ein festes Splat-Budget begrenzt: etwa 500.000 auf Mobilgeräten und etwa 2,5 Millionen auf Desktop-Computern. Es spielt keine Rolle, wie viele Splats in der Szene insgesamt vorhanden sind. Die Anzahl der Splats, die tatsächlich an die GPU gesendet werden, bleibt immer innerhalb des Budgets, und die Bildwiederholrate bleibt daher stabil.

Darüber hinaus hat Spark auch die "Foveated Rendering" eingeführt, die mehr Budget auf die Richtung lenkt, in die Sie gerade schauen. Die Details in den Rand- und hinteren Bereichen werden automatisch reduziert. Dieser Effekt ist besonders deutlich auf VR-Geräten, wo er normalerweise durch Augenbewegungserkennung realisiert wird. Spark simuliert diesen Effekt mit einem festen Kegelbereich und erreicht dasselbe Ergebnis.

2. Das neue .RAD-Format: "Streamen" wie beim Scrollen durch Kurzvideos

Das Problem der Renderleistung ist gelöst, aber das Problem der Übertragungsleistung ist ebenfalls schwierig. Es gibt zwei vorhandene 3DGS-Dateiformate: .PLY und .SPZ. Das erste ist unkomprimiert, und 10 Millionen Splats haben eine Größe von 2,3 GB. Obwohl es während des Downloads angezeigt werden kann, ist die Dateigröße zu groß.

Das zweite verwendet Spalten-Speicherung und Gzip-Komprimierung und komprimiert dieselbe Datenmenge auf 200 - 250 MB. Der Preis dafür ist, dass die gesamte Datei heruntergeladen werden muss, bevor sie angezeigt werden kann, da die Attribute jedes Splats über die gesamte Datei verteilt sind und ohne einen Teil keine vollständige Darstellung möglich ist.

Um beides zu haben, hat Spark 2.0 das neue Format .RAD (RADiance fields) entwickelt. Es teilt die Splat-Daten in unabhängige Blöcke von jeweils 64.000 Splats auf, komprimiert sie separat und speichert die Byte-Offset-Positionen aller Blöcke im Dateikopf. Dadurch ist es möglich, auf jeden beliebigen Block zuzugreifen.

Der erste Block besteht immer aus den 64.000 Splats mit der gröbsten Auflösung der gesamten Szene. Sobald er heruntergeladen ist, ist der Umriss der Szene sichtbar. Anschließend entscheidet das System anhand der Ansicht, welche Bereiche am meisten verfeinert werden müssen, und lädt die entsprechenden Datenblöcke bevorzugt herunter. Das Bild entwickelt sich allmählich von einer Unschärfe zu Details. Drei parallele Web Worker-Threads laden und dekodieren die Daten im Hintergrund synchron. Wo auch immer Sie hingehen, folgen die Details.

3. Virtueller GPU-Speicher: Unendlichen Raum in begrenzten Grafikspeicher packen

Das Streaming-Laden löst das Problem der Bandbreite, aber die feste Obergrenze des GPU-Speichers ist immer noch ein hartnäckiges Problem. Mobil-Browser haben strenge Beschränkungen für den Grafikspeicher und können nicht die gesamte Szene mit 40 Millionen Splats aufnehmen.

Spark 2.0 hat sich das Konzept des virtuellen Speichers vom Betriebssystem zu Nutze gemacht, um dieses Problem zu lösen.

Das System weist auf der GPU einen festen Speicherpool zu, der für maximal 16 Millionen Splats ausgelegt ist. Eine Seitentabelle registriert, welche .RAD-Datenblöcke derzeit auf der GPU vorhanden sind. Wenn ein Bereich gerendert werden muss, wird der entsprechende Block geladen. Wenn der Speicher voll ist, werden die ältesten Blöcke nach dem "Least Recently Used"-Prinzip ausgetauscht.

Dank dieses Mechanismus können 3DGS-Szenen aus verschiedenen Quellen denselben Speicherpool teilen. Theoretisch können unendlich viele unabhängige Scanszenen nahtlos zu einer unendlich großen Welt zusammengefügt werden, solange die Internetgeschwindigkeit es zulässt.

Mit einem Link die Welt liefern

Nach der Veröffentlichung von Spark 2.0 hat sich Fei-Fei Li auch sofort geäußert: "Spark 2.0 kann jetzt auf jedem Gerät reibungslos über 100 Millionen Splat-