Revision control
Copy as Markdown
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\page qtquick3d-changes-qt6.html
\title Changes to Qt Quick 3D
\ingroup changes-qt-5-to-6
\brief Migrate Qt Quick 3D to Qt 6.
Qt 6 is a result of the conscious effort to make the framework more
efficient and easy to use.
We try to maintain binary and source compatibility for all the public
APIs in each release. But some changes were inevitable in an effort to
make Qt a better framework. Parts of the Qt Quick 3D API have been
substantially modified.
In this topic we summarize those changes in Qt Quick 3D, and provide
guidance to handle them.
\section1 RHI
From Qt 6.0 onwards, the default adaptation of Qt Quick always renders via a
graphics abstraction layer, the Qt Rendering Hardware Interface (RHI),
provided by the \l QtGui module. This means that, unlike Qt 5, no direct
OpenGL calls are made by the scene graph. Rather, it records resource and
draw commands by using the RHI APIs, which then translate the command stream
into OpenGL, Vulkan, Metal, or Direct 3D calls. Shader handling is also
unified by writing shader code once, compiling to
language appropriate for the various graphics APIs.
For Qt Quick 3D the biggest change in Qt 6.0 is the migration to the common
Rendering Hardware Interface, which allows Qt Quick 3D to run on Direct3D,
Metal and Vulkan in addition to OpenGL and OpenGL ES.
Qt Quick and Qt Quick 3D are now fully unified in this regard. Any
configuration setting related to the RHI, for example, which graphics API to
choose to render with, are applicable to both.
See \l{Qt Quick 3D Graphics Requirements} for further details.
\section1 Other API changes
\section2 QML import version
Starting with Qt 6.0, the version number for QML import statements is the
same as the Qt version number. It is now also possible to import a module
without specifying a version: this will import the latest version of the module.
\section2 Lighting
\l {Light::brightness}{Light brightness} now represents an energy multiplier defaulting to 1.0, where
Qt 5 would use a percentage value defaulting to 100. In practice this
means that all \c brightness values should be divided by 100.
\c SceneEnvironment.probeBrightness is renamed to
\l {SceneEnvironment::probeExposure}{probeExposure} and is also redefined to
be a multiplier with a default value of 1.0. That is, all \c probeBrightness values
should be renamed to \c probeExposure and divided by 100.
\c AreaLight has been removed for performance reasons. In many cases it can be replaced
with \l SpotLight, which was added in Qt Quick 3D 5.15.
\section2 Custom Materials
The custom materials API has been completely reworked in 6.0. This means
any existing custom materials will have to be substantially rewritten.
See the \l CustomMaterial documentation for details of the new API.
\section2 Post-processing Effects
\l Effect has been enhanced to allow for shader code that is very close to
what \l CustomMaterial supports, following the same patterns when it comes
to structure and built-in keywords. This means that existing effects
involving custom shader code will need to be migrated before they can
function in Qt 6.0. See the \l Effect documentation for details.
\section2 Principled Material
The \l PrincipledMaterial QML type has been greatly improved in Qt Quick
6.0, and now more closely follows the principles of Physically Based
Rendering. Imported models should now render correctly without changing
properties of the materials. Existing materials will need to be changed to
undo any compensations for previous inaccuracies.
\table
\header
\li PrincipledMaterial in Qt 5
\li PrincipledMaterial in Qt 6
\row
\li \image quick3d-principled-qt5.png
{Teapot rendered with Qt 5 principled material}
\li \image quick3d-principled-qt6.png
{Teapot rendered with Qt 6 principled material}
\endtable
Some properties change their defaults:
\list
\li \l{PrincipledMaterial::metalness}{metalness} defaults to 0 instead of 1.
\li \l{PrincipledMaterial::specularAmount}{specularAmount} defaults to 0.5 instead of 0.
\endlist
\section2 Default Material
Some properties change their defaults:
\list
\li \l{DefaultMaterial::specularRoughness}{specularRoughness} defaults to 0 instead of 50.
\endlist
\section2 Predefined materials
There are no predefined materials included in QtQuick3D 6.0. Any
materials added in future releases will probably not be compatible with
the old ones. The Materials import does not exist. (The CustomMaterial
type is moved to the base QtQuick3D import.)
These are the material QML types that have been removed in Qt 6.0:
\list
\li AluminumAnodizedEmissiveMaterial
\li AluminumAnodizedMaterial
\li AluminumBrushedMaterial
\li AluminumEmissiveMaterial
\li AluminumMaterial
\li CopperMaterial
\li FrostedGlassMaterial
\li FrostedGlassSinglePassMaterial
\li GlassMaterial
\li GlassRefractiveMaterial
\li PaperArtisticMaterial
\li PaperOfficeMaterial
\li PlasticStructuredRedEmissiveMaterial
\li PlasticStructuredRedMaterial
\li SteelMilledConcentricMaterial
\endlist
\section2 Tessellation and displacement maps
Model tesselation mode is gone due to increased focus on supporting
embedded hardware. In addition, as a result, displacement map support has
been removed from materials. Similar effects can be achieved with a
\l {CustomMaterial}{custom material}.
\section2 Qt Quick \l{Item}s as children of 3D \l{Node}s
While syntactically identical, the way 2D child items are handled is quite
different internally. In Qt 6.0 there is no implicit render to texture
step. Rather, the 2D Qt Quick content is rendered in line, with the
appropriate perspective projection, in the same render pass, which provides
better performance, lower resource usage, and in some cases potentially
improved visual fidelity (with \l Text, for example). See \l{Qt Quick 3D
Scenes with 2D Content} for an overview.
If going through a texture is important for some reason (clipping, opacity),
make the 2D \l Item subtree a layer explicitly by setting \c{layer.enabled:
true}. This way the behavior is closer to what Qt 5.15 provided.
The 2D content is no longer centered at the parent Node's origin. Rather, it
is the top-level 2D Item's top-left corner that is placed to the 3D Node's
origin. Therefore, the top-level 2D Item will often want to specify an
anchor, such as, \c{anchors.centerIn: parent}, to get results matching Qt
5.15.
*/