Qt 3D Übersicht
Qt 3D bietet einen vollständig konfigurierbaren Renderer, der es Entwicklern ermöglicht, jede benötigte Rendering-Pipeline schnell zu implementieren. Darüber hinaus bietet „ Qt 3D “ ein generisches Framework für Simulationen in nahezu Echtzeit, das über das Rendering hinausgeht.
Qt 3D ist klar in einen Kern und eine beliebige Anzahl von Aspekten unterteilt, die jede gewünschte Funktionalität implementieren können. Die Aspekte interagieren mit Komponenten und Entitäten, um bestimmte Funktionsbereiche bereitzustellen. Beispiele für Aspekte sind Physik, Audio, Kollision, künstliche Intelligenz (KI) und Wegfindung.
Grundlegende 3D-Funktionen
Qt 3D ist ein 3D-Framework, das das Zeichnen und Verschieben von 3D-Formen sowie das Bewegen der Kamera ermöglicht. Es unterstützt die folgenden grundlegenden Funktionen:
- 2D- und 3D- rendering en für C++- und „ Qt Quick “-Anwendungen
- Meshes und Geometrie
- Materials
- Shader
- Schattenabbildung
- Ambient occlusion
- Hoher Dynamikbereich
- Deferred Rendering
- Multitexturierung
- Instanziertes Rendering
- Uniform-Buffer-Objekte
- Portierung auf RHI
- Profi-Tipps
Materialien
Qt 3D verfügt über ein robustes und sehr flexibles Materialsystem, das vielfältige Anpassungsmöglichkeiten bietet. Es unterstützt unterschiedliche Rendering-Ansätze auf verschiedenen Plattformen oder OpenGL-Versionen, ermöglicht mehrere Rendering-Durchläufe mit unterschiedlichen Zustandssätzen, bietet Mechanismen zum Überschreiben von Parametern auf verschiedenen Ebenen und ermöglicht einen einfachen Wechsel zwischen Shadern. All dies ist über C++ oder mithilfe von QML-Eigenschaftsbindungen möglich.
Die Eigenschaften eines Typs „ Material “ lassen sich problemlos auf „uniform“-Variablen in einem GLSL-Shader-Programm abbilden, das wiederum in der referenzierten Effekt-Eigenschaft festgelegt ist.
Beispiele für die Verwendung von Materialien finden Sie in den folgenden Beispielen:
- Qt 3D: Einfaches QML-Beispiel für benutzerdefinierte Materialien
- Qt 3D: QML-Beispiel für PBR-Materialien
Shader
Qt 3D unterstützt alle programmierbaren Stufen der OpenGL-Rendering-Pipeline: Vertex-, Tessellationssteuerungs-, Tessellationsauswertungs-, Geometrie- und Fragment-Shader. Compute-Shader sind für eine zukünftige Version geplant.
Beispiele für die Verwendung von Shadern finden Sie unter „Qt 3D: Drahtgitter-Beispiel in QML“.
Schattenabbildung
Schatten werden von OpenGL nicht direkt unterstützt, es gibt jedoch unzählige Techniken, mit denen sie erzeugt werden können. Shadow Mapping ist einfach anzuwenden, um ansprechende Schatten zu erzeugen, und verursacht dabei nur einen sehr geringen Leistungsaufwand.
Shadow Mapping wird typischerweise mithilfe eines Zwei-Pass-Renderings implementiert. Im ersten Durchgang werden die Schatteninformationen generiert. Im zweiten Durchgang wird die Szene mithilfe einer bestimmten Rendering-Technik gerendert, wobei gleichzeitig die im ersten Durchgang gesammelten Informationen zum Zeichnen der Schatten verwendet werden.
Die Idee hinter dem Shadow Mapping besteht darin, dass nur die Fragmente beleuchtet werden, die der Lichtquelle am nächsten liegen. Fragmente, die sich hinter anderen Fragmenten befinden, werden verdeckt und liegen daher im Schatten.
Daher wird die Szene im ersten Durchgang aus der Perspektive der Lichtquelle gezeichnet. Die gespeicherte Information ist lediglich die Entfernung des nächstgelegenen Fragments in diesem Lichtraum. In OpenGL-Begriffen entspricht dies einem Framebuffer-Objekt (FBO), an das eine Tiefentextur angehängt ist. Tatsächlich ist der Abstand vom Auge die Definition der Tiefe, und die von OpenGL standardmäßig durchgeführte Tiefenprüfung speichert tatsächlich nur die Tiefe des nächstgelegenen Fragments.
Eine angehängte Farbtextur ist nicht einmal erforderlich, da die Fragmente nicht schattiert, sondern lediglich ihre Tiefe berechnet werden muss.
Das folgende Bild zeigt eine Szene mit einer selbstbeschatteten Ebene und einem Kleeblattknoten:

Das folgende Bild zeigt eine übertriebene Schattenkarte der Szene:

Das Bild zeigt die Tiefe, die beim Rendern der Szene aus der Perspektive des Lichtpunkts gespeichert wird. Dunkle Farben stehen für eine geringe Tiefe (d. h. näher an der Kamera). In dieser Szene befindet sich die Lichtquelle irgendwo über den Objekten in der Szene, auf der rechten Seite in Bezug auf die Hauptkamera (vergleiche dies mit dem ersten Screenshot). Dies stimmt mit der Tatsache überein, dass die Spielzeug-Ebene näher an der Kamera liegt als die anderen Objekte.
Sobald die Schattenkarte generiert wurde, erfolgt der zweite Rendering-Durchgang. In diesem zweiten Durchgang erfolgt das Rendering mit der normalen Kamera der Szene. Hier kann jeder beliebige Effekt verwendet werden, beispielsweise Phong-Shading. Wichtig ist, dass der Schattenkartenalgorithmus im Fragment-Shader angewendet wird. Das heißt, das Fragment, das der Lichtquelle am nächsten liegt, wird beleuchtet dargestellt, während die anderen Fragmente im Schatten liegen.
Die im ersten Durchgang erzeugte Schattenkarte liefert die notwendigen Informationen über den Abstand der Fragmente zur Lichtquelle. Es reicht dann aus, das Fragment in den Lichtraum abzubilden und so seine Tiefe aus der Perspektive der Lichtquelle sowie seine Koordinaten auf der Schattenkarten-Textur zu berechnen. Die Schattenkarten-Textur kann dann an den gegebenen Koordinaten abgetastet werden, und die Tiefe des Fragments kann mit dem Ergebnis der Abtastung verglichen werden. Befindet sich das Fragment weiter entfernt, liegt es im Schatten; andernfalls ist es beleuchtet.
Instanziertes Rendering
Instanziierung ist eine Methode, mit der die GPU dazu gebracht wird, viele Kopien (Instanzen) eines Basisobjekts zu zeichnen, die sich bei jeder Kopie in irgendeiner Weise unterscheiden. Häufig sind dies Position, Ausrichtung, Farbe, Materialeigenschaften, Skalierung und so weiter. „ Qt 3D “ stellt eine API bereit, die dem Element „ Qt Quick “ Repeater ähnelt. In diesem Fall ist das Basisobjekt der Delegat, und das Modell liefert die instanzspezifischen Daten. Während also eine Entität, an die eine „ Mesh “-Komponente angehängt ist, letztendlich in einen Aufruf von `glDrawElements` umgewandelt wird, wird eine Entität mit einer „instanced“-Komponente in einen Aufruf von `glDrawElementsInstanced` übersetzt.
Das instanzierte Rendering ist für eine zukünftige Version geplant.
Uniform Buffer Objects
Ein Uniform-Buffer-Objekt (UBO) kann an OpenGL-Shader-Programme gebunden werden, um große Datenmengen direkt verfügbar zu machen. Typische Anwendungsfälle für UBOs sind Sätze von Material- oder Beleuchtungsparametern.
Nützliche Tipps
Einige sehr nützliche Programmiertipps für das 3D-Rendering finden Sie auf dieser Seite: Qt 3D Render Pro Tips.
Konfigurierbarer Renderer
Um die Unterstützung sowohl für C++- als auch für QML-APIs mit einem vollständig konfigurierbaren Renderer zu kombinieren, wurde das Konzept eines Framegraphs eingeführt. Während ein Scenegraph eine datengesteuerte Beschreibung dessen ist, was gerendert werden soll, ist ein Framegraph eine datengesteuerte Beschreibung, wie es gerendert werden soll.
Ein Framegraph ermöglicht es Entwicklern, beispielsweise zwischen einem einfachen Forward-Renderer einschließlich eines Z-Fill-Passes und einem Deferred-Renderer zu wählen. Außerdem können sie damit steuern, wann transparente Objekte gerendert werden sollen, und so weiter. Da all dies rein datengesteuert konfiguriert wird, lassen sich die Einstellungen auch dynamisch zur Laufzeit ganz einfach anpassen, ohne C++-Code zu verändern. Es ist möglich, „ Qt 3D “ zu erweitern, indem eigene Framegraphs erstellt werden, die benutzerdefinierte Rendering-Algorithmen implementieren.
3D-Erweiterungen
Über die Grundlagen der Darstellung von 3D-Inhalten auf dem Bildschirm hinaus ist „ Qt 3D “ so erweiterbar und flexibel, dass es als Host für die folgenden Arten von Erweiterungen im Zusammenhang mit 3D-Objekten dienen kann:
- Physiksimulation
- Kollisionserkennung
- 3D-Positionsaudio
- Animation von starren Körpern, Skeletten und Morph-Zielen
- Wegfindung und andere KI-Funktionen
- Auswahl
- Partikel
- Objekt-Spawning
Leistung
Qt 3D ist darauf ausgelegt, eine gute Leistung zu erbringen und mit der Anzahl der verfügbaren CPU-Kerne zu skalieren, da moderne Hardware die Leistung eher durch eine Erhöhung der Kernanzahl als durch die Basistaktfrequenz verbessert. Die Nutzung mehrerer Kerne funktioniert gut, da viele Aufgaben voneinander unabhängig sind. Beispielsweise überschneiden sich die von einem Wegfindungsmodul ausgeführten Operationen kaum mit den Aufgaben eines Renderers – außer vielleicht beim Rendern von Debug-Informationen oder Statistiken.
Qt 3D Architektur
Die Hauptanwendungsfälle von „ Qt 3D “ sind die Simulation von Objekten nahezu in Echtzeit und das Rendern des Zustands dieser Objekte auf dem Bildschirm. Das „Space Invaders“-Beispiel enthält die folgenden Objekte:

- Die Bodenkanone des Spielers
- Der Boden
- Die Verteidigungsblöcke
- Die feindlichen Space-Invaders-Raumschiffe
- Die fliegende Untertasse des Endgegners
- Die von den Gegnern und dem Spieler abgefeuerten Geschosse
In einem traditionellen C++-Design würden diese Objekttypen typischerweise als Klassen implementiert, die in einer Art Vererbungsbaum angeordnet sind. Verschiedene Zweige im Vererbungsbaum könnten der Basisklasse zusätzliche Funktionen hinzufügen, beispielsweise für folgende Merkmale:
- Akzeptiert Benutzereingaben
- Spielt einen Ton ab
- Ist animiert
- Kollidiert mit anderen Objekten
- Wird auf dem Bildschirm dargestellt
Die Typen im Beispiel „Space Invaders“ lassen sich anhand dieser Merkmale klassifizieren. Allerdings ist es selbst bei einem so einfachen Beispiel nicht einfach, einen eleganten Vererbungsbaum zu entwerfen.
Dieser Ansatz und andere Varianten der Vererbung bringen eine Reihe von Problemen mit sich:
- Tiefe und breite Vererbungshierarchien sind schwer zu verstehen, zu warten und zu erweitern.
- Die Vererbungsstruktur wird bereits zur Kompilierungszeit festgeschrieben.
- Jede Ebene im Klassenvererbungsbaum kann nur nach einem einzigen Kriterium oder einer einzigen Achse klassifizieren.
- Gemeinsame Funktionalität neigt dazu, im Laufe der Zeit in der Klassenhierarchie nach oben zu wandern.
- Es ist unmöglich vorherzusagen, was die Entwickler tun wollen.
Die Erweiterung tiefer und weit verzweigter Vererbungsbäume erfordert in der Regel, dass man die vom ursprünglichen Autor verwendete Taxonomie versteht und ihr zustimmt. Daher legt „ Qt 3D “ den Schwerpunkt auf Aggregation statt auf Vererbung als Mittel zur Übertragung von Funktionalität auf eine Objektinstanz. Konkret implementiert „ Qt 3D “ ein Entity-Component-System (ECS).
Verwendung eines ECS
In einem ECS repräsentiert eine Entität ein simuliertes Objekt, verfügt jedoch für sich genommen über keinerlei spezifisches Verhalten oder Eigenschaften. Zusätzliches Verhalten kann einer Entität hinzugefügt werden, indem die Entität eine oder mehrere Komponenten aggregiert. Jede Komponente ist ein vertikaler Ausschnitt des Verhaltens eines Objekttyps.
Im Beispiel „Space Invaders“ ist der Boden eine Entität mit einer angehängten Komponente, die dem System mitteilt, dass die Entität gerendert werden muss und welche Art von Rendering erforderlich ist. Ein feindliches „Space Invaders“-Raumschiff ist eine weitere Entität mit angehängten Komponenten, die dafür sorgen, dass das Schiff gerendert wird, es aber auch in die Lage versetzen, Geräusche von sich zu geben, Kollisionen zu erleben, animiert zu werden und von einer einfachen KI gesteuert zu werden.
Die Bodenkanonen-Entität des Spielers verfügt größtenteils über ähnliche Komponenten wie das feindliche „Space Invaders“-Raumschiff, mit der Ausnahme, dass ihr die KI-Komponente fehlt. Stattdessen verfügt die Kanone über eine Eingabekomponente, die es dem Spieler ermöglicht, sie zu bewegen und Schüsse abzufeuern.
ECS-Backend

Das Backend von „ Qt 3D “ implementiert den Systemteil des ECS-Paradigmas in Form von Aspekten. Ein Aspekt implementiert den jeweiligen vertikalen Ausschnitt der Funktionalität, die Entitäten durch eine Kombination aus einer oder mehreren ihrer aggregierten Komponenten bereitgestellt wird.
Beispielsweise sucht der Renderer-Aspekt nach Entitäten, die über Mesh-, Material- und optional Transformationskomponenten verfügen. Findet der Renderer-Aspekt eine solche Entität, weiß er, wie er diese Daten nutzen und daraus etwas Ansprechendes darstellen kann. Verfügt eine Entität nicht über diese Komponenten, ignoriert der Renderer-Aspekt sie.
Qt 3D Erstellt benutzerdefinierte Entitäten durch die Aggregation von Komponenten, die zusätzliche Funktionen bereitstellen. Die „ Qt 3D “-Engine nutzt Aspekte, um Entitäten mit bestimmten Komponenten zu verarbeiten und zu aktualisieren.
Ein Physik-Aspekt sucht beispielsweise nach Entitäten, die über eine Art Kollisionsvolumen-Komponente verfügen, sowie über eine weitere Komponente, die andere für solche Simulationen benötigte Eigenschaften wie Masse, Reibungskoeffizient usw. festlegt. Eine Entität, die Geräusche abgibt, verfügt über eine Komponente, die angibt, dass es sich um einen Sound-Emitter handelt, und die festlegt, wann und welche Geräusche abgespielt werden sollen.
Da ECS Aggregation anstelle von Vererbung nutzt, ist es möglich, das Verhalten eines Objekts zur Laufzeit dynamisch zu ändern, indem einfach Komponenten hinzugefügt oder entfernt werden.
Um beispielsweise einem Spieler zu ermöglichen, nach einem Power-Up plötzlich durch Wände zu laufen, kann die Kollisionsvolumen-Komponente dieser Entität vorübergehend entfernt werden, bis die Wirkungsdauer des Power-Ups abgelaufen ist. Es ist nicht notwendig, eine spezielle, einmalige Unterklasse für „ PlayerWhoRunsThroughWalls “ zu erstellen.
Qt 3D ECS-Implementierung
Qt 3D implementiert ECS als einfache Klassenhierarchie. Die Basisklasse von „ Qt 3D “ ist „Qt3DCore::QNode“, eine Unterklasse von „ QObject “. „Qt3DCore::QNode“ erweitert „ QObject “ um die Fähigkeit, Eigenschaftsänderungen automatisch an Aspekte weiterzugeben, sowie um eine ID, die innerhalb der gesamten Anwendung eindeutig ist. Die Aspekte existieren in zusätzlichen Threads, und Qt3DCore::QNode vereinfacht die Datenübertragung zwischen den benutzerseitigen Objekten und den Aspekten.
In der Regel stellen Unterklassen von `Qt3DCore::QNode` zusätzliche Hilfsdaten bereit, auf die von Komponenten verwiesen wird. Beispielsweise legt die Klasse `QShaderProgram` den GLSL-Code fest, der beim Rendern einer Reihe von Entitäten verwendet werden soll.

Komponenten in „ Qt 3D “ werden implementiert, indem man Qt3DCore::QComponent unterklassifiziert und die Daten hinzufügt, die der entsprechende Aspekt benötigt, um seine Aufgabe zu erfüllen. Beispielsweise wird die Mesh-Komponente vom Renderer-Aspekt verwendet, um die Daten pro Scheitelpunkt abzurufen, die an die OpenGL-Pipeline weitergeleitet werden sollen.
Schließlich ist `Qt3DCore::QEntity` lediglich ein Objekt, das null oder mehr Instanzen von `Qt3DCore::QComponent` aggregieren kann.
Erweiterung Qt 3D
Das Hinzufügen von Funktionalität zu „ Qt 3D “ – sei es als Teil von Qt XML oder speziell für Ihre eigenen Anwendungen, um von dem multithreaded Backend zu profitieren – umfasst die folgenden Aufgaben:
- Identifizieren und implementieren Sie alle erforderlichen Komponenten und unterstützenden Daten.
- Registrieren Sie die Komponenten bei der QML-Engine (nur, wenn Sie die QML-API verwenden).
- Erstellen Sie eine Unterklasse von `QAbstractAspect` und implementieren Sie die Subsystemfunktionalität.
Qt 3D Aufgabenbasierte Engine
In Qt 3D werden Aspekte in jedem Frame nach einer Reihe von auszuführenden Aufgaben sowie den Abhängigkeiten zwischen diesen abgefragt. Die Aufgaben werden von einem Scheduler auf alle konfigurierten Kerne verteilt, um die Leistung zu verbessern.
Qt 3DAspekte
Standardmäßig stellt „ Qt 3D “ die Aspekte „Qt3DRender“ und „Qt3DInput“ bereit. Die von diesen Aspekten bereitgestellten Komponenten und weiteren unterstützenden Klassen werden in der Dokumentation zu diesen Modulen erläutert.
In zukünftigen Versionen von „ Qt 3D “ werden weitere Aspekte hinzugefügt, die zusätzliche Funktionen bieten.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.