Die Änderungen an Qt Quick 3D

Qt 6 sind das Ergebnis des bewussten Bemühens, das Framework effizienter und benutzerfreundlicher zu gestalten.

Wir versuchen, die Binär- und Quellcodekompatibilität für alle öffentlichen APIs in jeder Version zu erhalten. Einige Änderungen waren jedoch unvermeidlich, um Qt zu einem besseren Framework zu machen. Teile der Qt Quick 3D API wurden erheblich modifiziert.

In diesem Thema fassen wir diese Änderungen in Qt Quick 3D zusammen und geben eine Anleitung für den Umgang mit ihnen.

RHI

Ab Qt 6.0 erfolgt die Standardanpassung von Qt Quick immer über eine Grafikabstraktionsschicht, das Qt Rendering Hardware Interface (RHI), das durch das Modul QtGui bereitgestellt wird. Das bedeutet, dass im Gegensatz zu Qt 5 keine direkten OpenGL-Aufrufe durch den Szenegraphen erfolgen. Stattdessen werden Ressourcen- und Zeichenbefehle mit Hilfe der RHI-APIs aufgezeichnet, die dann den Befehlsstrom in OpenGL-, Vulkan-, Metal- oder Direct 3D-Aufrufe übersetzen. Auch die Shader-Verarbeitung wird vereinheitlicht, indem Shader-Code einmal geschrieben, nach SPIR-V kompiliert und dann in die für die verschiedenen Grafik-APIs geeignete Sprache übersetzt wird.

Für Qt Quick 3D ist die größte Änderung in Qt 6.0 die Migration zur gemeinsamen Rendering-Hardware-Schnittstelle, die es Qt Quick 3D ermöglicht, zusätzlich zu OpenGL und OpenGL ES auch auf Direct3D, Metal und Vulkan zu laufen.

Qt Quick Qt und Qt Quick 3D sind in dieser Hinsicht nun vollständig vereinheitlicht. Alle Konfigurationseinstellungen, die sich auf die RHI beziehen, z. B. welche Grafik-API für das Rendering gewählt wird, gelten für beide.

Weitere Einzelheiten finden Sie unter Qt Quick 3D Grafikanforderungen.

Andere API-Änderungen

QML-Importversion

Ab Qt 6.0 ist die Versionsnummer für QML-Importanweisungen dieselbe wie die Qt-Versionsnummer. Es ist nun auch möglich, ein Modul zu importieren, ohne eine Version anzugeben: dies wird die neueste Version des Moduls importieren.

Beleuchtung

Light brightness stellt nun einen Energiemultiplikator dar, der standardmäßig 1,0 beträgt, während Qt 5 einen Prozentwert verwendet, der standardmäßig 100 beträgt. In der Praxis bedeutet dies, dass alle brightness Werte durch 100 geteilt werden sollten.

SceneEnvironment.probeBrightness wird in probeExposure umbenannt und ebenfalls als Multiplikator mit einem Standardwert von 1,0 neu definiert. Das heißt, dass alle probeBrightness -Werte in probeExposure umbenannt und durch 100 geteilt werden sollten.

AreaLight wurde aus Leistungsgründen entfernt. In vielen Fällen kann sie durch SpotLight ersetzt werden, das in Qt Quick 3D 5.15 hinzugefügt wurde.

Benutzerdefinierte Materialien

Die API für benutzerdefinierte Materialien wurde in 6.0 komplett überarbeitet. Das bedeutet, dass alle vorhandenen benutzerdefinierten Materialien grundlegend neu geschrieben werden müssen. Einzelheiten über die neue API finden Sie in der Dokumentation CustomMaterial.

Post-Processing-Effekte

Effect wurde verbessert, um Shader-Code zu ermöglichen, der dem von CustomMaterial unterstützten Code sehr ähnlich ist und in Bezug auf Struktur und eingebaute Schlüsselwörter denselben Mustern folgt. Dies bedeutet, dass bestehende Effekte, die benutzerdefinierten Shader-Code beinhalten, migriert werden müssen, bevor sie in Qt 6.0 funktionieren. Siehe die Effect Dokumentation für Details.

Prinzipielles Material

Der PrincipledMaterial QML-Typ wurde in Qt Quick 6.0 stark verbessert und folgt nun stärker den Prinzipien des Physically Based Rendering. Importierte Modelle sollten nun korrekt gerendert werden, ohne dass die Eigenschaften der Materialien geändert werden müssen. Vorhandene Materialien müssen geändert werden, um die Kompensationen für frühere Ungenauigkeiten rückgängig zu machen.

Einige Eigenschaften ändern ihre Standardwerte:

Standard Material

Bei einigen Eigenschaften ändern sich die Standardwerte:

Vordefinierte Materialien

Es sind keine vordefinierten Materialien in QtQuick3D 6.0 enthalten. Alle Materialien, die in zukünftigen Versionen hinzugefügt werden, werden wahrscheinlich nicht mit den alten kompatibel sein. Der Import von Materialien ist nicht vorhanden. (Der Typ CustomMaterial wurde in den Basisimport QtQuick3D verschoben).

Die folgenden Material-QML-Typen wurden in Qt 6.0 entfernt:

  • AluminumAnodizedEmissiveMaterial
  • AluminumAnodizedMaterial
  • AluminumBrushedMaterial
  • AluminumEmissiveMaterial
  • AluminiumWerkstoff
  • KupferWerkstoff
  • FrostedGlassMaterial
  • FrostedGlassSinglePassWerkstoff
  • GlasWerkstoff
  • GlasBrechendWerkstoff
  • PapierKunstWerkstoff
  • PapierBüroWerkstoff
  • KunststoffStrukturiertRotEmissivMaterial
  • KunststoffStrukturiertRotWerkstoff
  • StahlFräsenKonzentrischMaterial

Tesselation und Verschiebungskarten

Der Modus zur Modell-Tesselierung wurde abgeschafft, da der Schwerpunkt auf der Unterstützung eingebetteter Hardware liegt. Darüber hinaus wurde die Unterstützung für Displacement Maps aus den Materialien entfernt. Ähnliche Effekte können mit einem custom material erzielt werden.

Qt Quick Items als Kinder von 3D Nodes

Obwohl syntaktisch identisch, ist die Art und Weise, wie 2D-Kinderelemente intern gehandhabt werden, recht unterschiedlich. In Qt 6.0 gibt es keinen impliziten Render-to-Texture-Schritt. Stattdessen wird der 2D-Inhalt von Qt Quick mit der entsprechenden perspektivischen Projektion im selben Rendering-Durchgang gerendert, was eine bessere Leistung, einen geringeren Ressourcenverbrauch und in einigen Fällen eine potenziell verbesserte visuelle Wiedergabetreue (z. B. mit Text) bietet. Einen Überblick finden Sie unter Qt Quick 3D Szenen mit 2D-Inhalten.

Wenn der Durchgang durch eine Textur aus irgendeinem Grund wichtig ist (Beschneidung, Deckkraft), machen Sie den 2D Item Teilbaum explizit zu einer Ebene, indem Sie layer.enabled: true setzen. Auf diese Weise ist das Verhalten näher an dem, was Qt 5.15 bot.

Der 2D-Inhalt wird nicht mehr am Ursprung des übergeordneten Knotens zentriert. Stattdessen wird die obere linke Ecke des 2D-Elements der obersten Ebene auf den Ursprung des 3D-Knotens gelegt. Daher wird das 2D-Element der obersten Ebene oft einen Anker angeben wollen, wie z.B. anchors.centerIn: parent, um Ergebnisse zu erhalten, die mit Qt 5.15.

© 2025 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.