/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
\page topics-graphics.html
\title Graphics
\brief Qt's graphics features


Cross-platform applications can use Qt to display graphical elements. Qt
abstracts the platforms' underlying graphics APIs so that developers can focus
on the application code.

\inlineimage rhiarch.png

The Qt Rendering Hardware Interface (RHI) translates 3D graphics call from
Qt applications to the available graphics APIs on the target platform.

The supported graphics APIs are:
\list
\li OpenGL (version 3 and higher)
\li OpenGL ES (version 2 and higher)
\li Vulkan (1.0 and higher)
\li Direct3D 11 (11.1 and higher)
\li Metal
\endlist


\section1 Graphics in Qt Quick

Qt Quick applications use a \l{Qt Quick Scene Graph}{scene graph} for rendering.
The scene graph renderer can create efficient graphics calls and increase
performance. The scene graph is has an accessible API which gives you the
flexibility to create complex but fast graphics.

The pages in the following list contain more information about rendering Qt
Quick applications.
\list
    \li \l{Qt Quick Scene Graph}
    \li \l{Scene Graph and Rendering}
    \li \l{Qt Quick Scene Graph Default Renderer}
    \li \l {Mixing Scene Graph and the native graphics API}{OpenGL and Qt Quick 2.0}
        - How to integrate application-provided graphics commands
        (OpenGL, Vulkan, Direct3D, etc.) into a Qt Quick scene graph.
\endlist

Qt Quick can also be rendered using \l{Qt Quick 2D Renderer}. This raster
paint engine enables rendering Qt Quick applications on platforms that
do not have OpenGL.

\section2 Choosing a Rendering Path

Qt uses the target platform's graphics APIs whenever possible, however, it is
possible to set up Qt's rendering path with a specific API. In many cases,
choosing a specific API can increase performance and allows the developers to
deploy on a platform that have a specific graphics API. Visit the
\l{Qt Quick Scene Graph Default Renderer#Rendering via the Qt Rendering Hardware Interface}
{Rendering via the Qt Rendering Hardware Interface}
page on how to set the render path in QQuickWindow.

\section1 3D Graphics with Qt Quick 3D

\l{Qt Quick 3D} is an add-on that provides a high-level API for creating 3D
content and 3D user interfaces based on Qt Quick. It extends the
\l{qtquick-visualcanvas-scenegraph.html}{Qt Quick Scene Graph} which lets you
implement 3D content on 2D Qt Quick applications.

\inlineimage blogs/BenchmarkDemoQt6.png


\section1 Shader Effects

The \l{Qt Shader Tools} provides a tool, \l{QSB Manual}{QSB}, to translate
vertex and fragment shaders into a package for Qt Quick interfaces. In
particular, the \l ShaderEffect QML type and \l QSGMaterial subclasses can use
the output of QSB. \l{Qt Quick 3D} has its own framework for importing shaders
into 3D scenes.

The following list contains information about shader effects.
\list
\li \l{Qt Shader Tools}
\li \l{Programmable Materials, Effects, Geometry, and Texture data} - materials and shaders in Qt Quick 3D
\endlist

\inlineimage blogs/qtquick3D.png


\section1 High-Level Graphics with Qt GUI

\l{Qt GUI} provides a high level windowing, painting, and typography system.
QPainter provides an API for drawing vector graphics, text and images onto
different surfaces, or QPaintDevice instances, such as QImage,
QOpenGLPaintDevice, QWidget, and QPrinter. For Qt Widgets user interfaces,
Qt uses a software renderer.

The following list contains information about Qt GUIs high-level drawing APIs.

\list
    \li \l{Paint System}
    \li \l{Coordinate System}
    \li \l{Drawing and Filling}
\endlist


\section1 Qt OpenGL Module

The \l{Qt OpenGL} module is for applications that require OpenGL access.
This module is to maintain compatibility with Qt 5 applications and with Qt GUI.
For user interfaces that use QWidget, QOpenGLWidget is a widget that can add
OpenGL scenes.


\section1 Printing

Qt supports printing both directly to actual printers, locally or on the
network, as well as producing PDF output. How to do printing with
Qt is described in detail on the \l {Qt Print Support} page.


\section1 Images

Qt supports convenient reading, writing, and manipulating of images through the
QImage class. In addition, for more fine grained control of how images are
loaded or saved, you can use the QImageReader and QImageWriter classes
respectively. To add support for additional image formats, outside of the ones
provided by Qt, you can create image format plugins by using QImageIOHandler
and QImageIOPlugin.

See the \l {Reading and Writing Image Files} page for more information.

*/
