Spec-Zone.ru › Qt 5.6

Тип QML ShaderEffect

Применяет пользовательские шейдеры к прямоугольнику Подробнее...

Заявление об импорте: import QtQuick 2.5
Наследует:

Item

  • Список всех членов, включая унаследованные

Свойства

  • blending : bool
  • cullMode : перечисление
  • fragmentShader : строка
  • log : строка
  • mesh : значение
  • status : перечисление
  • supportsAtlasTextures : bool
  • vertexShader : строка

Подробное описание

Тип ShaderEffect применяет пользовательский шейдер OpenGL вершин и фрагментов к прямоугольнику. Он позволяет писать эффекты, такие как тень, размытие, изменение цвета и изгиб страницы, непосредственно в QML.

Существует два типа входных данных для vertexShader: переменные и атрибуты. Некоторые из них определены:

  • uniform mat4 qt_Matrix - комбинированная матрица преобразований, результат умножения матриц от корневого элемента до этого ShaderEffect, и ортогональной проекции.
  • uniform float qt_Opacity - комбинированная непрозрачность, результат умножения непрозрачностей от корневого элемента до этого ShaderEffect.
  • attribute vec4 qt_Vertex - позиция вершины, верхняя левая вершина имеет позицию (0, 0), правая нижняя (ширина, высота).
  • attribute vec2 qt_MultiTexCoord0 - текстурная координата, верхняя левая координата (0, 0), правая нижняя (1, 1). Если supportsAtlasTextures true, координаты будут основаны на позиции в атласе.

Кроме того, доступна любая свойство, которую можно сопоставить с типом OpenGL Shading Language (GLSL), в качестве переменной.

  • bool, int, qreal -> bool, int, float - Если тип в шейдере не совпадает с типом в QML, значение автоматически преобразуется.
  • QColor -> vec4 - При передаче цветов в шейдер они предварительно умножаются. Таким образом, Qt.rgba(0.2, 0.6, 1.0, 0.5) преобразуется в vec4(0.1, 0.3, 0.5, 0.5) в шейдере, например.
  • QRect, QRectF -> vec4 - Qt.rect(x, y, w, h) преобразуется в vec4(x, y, w, h) в шейдере.
  • QPoint, QPointF, QSize, QSizeF -> vec2
  • QVector3D -> vec3
  • QVector4D -> vec4
  • QTransform -> mat3
  • QMatrix4x4 -> mat4
  • QQuaternion -> vec4, скалярное значение w.
  • Image -> sampler2D - Начало в верхнем левом углу, значения цветов предварительно умножаются. Текстура предоставляется как есть, исключая fillMode элемента Image. Для включения fillMode используйте ShaderEffectSource или Image::layer::enabled.
  • ShaderEffectSource -> sampler2D - Начало в верхнем левом углу, значения цветов предварительно умножаются.

Бэкенд QML графа сцены может выбирать выделение текстур в атласах текстур. Если текстура, выделенная в атласе, передается в ShaderEffect, по умолчанию она копируется из атласа текстур в отдельную текстуру, чтобы текстурные координаты изменялись от 0 до 1, и вы получаете ожидаемые режимы обрезки. Однако это увеличит использование памяти. Чтобы избежать копирования текстуры, установите supportsAtlasTextures для простых шейдеров, использующих qt_MultiTexCoord0, или для каждого "uniform sampler2D <name>" объявите "uniform vec4 qt_SubRect_<name>", которые будут назначены нормализованному прямоугольнику источника текстуры. Для автономных текстур прямоугольник источника [0, 1]x[0, 1]. Для текстур в атласе прямоугольник источника соответствует части атласа текстур, где хранится текстура. Правильный способ вычисления текстурной координаты для текстуры с именем "source" в атласе текстур — это "qt_SubRect_source.xy + qt_SubRect_source.zw * qt_MultiTexCoord0".

Выходной сигнал из fragmentShader должен быть предварительно умножен. Если blending включен, используется режим смешивания source-over. Однако аддитивное смешивание может быть достигнуто путем вывода нуля в альфа-канале.

import QtQuick 2.0

Rectangle {
    width: 200; height: 100
    Row {
        Image { id: img;
                sourceSize { width: 100; height: 100 } source: "qt-logo.png" }
        ShaderEffect {
            width: 100; height: 100
            property variant src: img
            vertexShader: "
                uniform highp mat4 qt_Matrix;
                attribute highp vec4 qt_Vertex;
                attribute highp vec2 qt_MultiTexCoord0;
                varying highp vec2 coord;
                void main() {
                    coord = qt_MultiTexCoord0;
                    gl_Position = qt_Matrix * qt_Vertex;
                }"
            fragmentShader: "
                varying highp vec2 coord;
                uniform sampler2D src;
                uniform lowp float qt_Opacity;
                void main() {
                    lowp vec4 tex = texture2D(src, coord);
                    gl_FragColor = vec4(vec3(dot(tex.rgb,
                                        vec3(0.344, 0.5, 0.156))),
                                             tex.a) * qt_Opacity;
                }"
        }
    }
}

По умолчанию ShaderEffect состоит из четырех вершин, по одной для каждого угла. Для нелинейных преобразований вершин, таких как изгиб страницы, вы можете указать тонкую сетку вершин, задав разрешение mesh.

ShaderEffect и слои элементов

Тип ShaderEffect можно комбинировать со слоями элементов.

Слой с отключенным эффектом Слой с включенным эффектом
Item {
    id: layerRoot
    layer.enabled: true
    layer.effect: ShaderEffect {
        fragmentShader: "
            uniform lowp sampler2D source; // this item
            uniform lowp float qt_Opacity; // inherited opacity of this item
            varying highp vec2 qt_TexCoord0;
            void main() {
                lowp vec4 p = texture2D(source, qt_TexCoord0);
                lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156));
                gl_FragColor = vec4(g, g, g, p.a) * qt_Opacity;
            }"
    }

Также можно комбинировать несколько слоев элементов:

    Rectangle {
        id: gradientRect;
        width: 10
        height: 10
        gradient: Gradient {
            GradientStop { position: 0; color: "white" }
            GradientStop { position: 1; color: "steelblue" }
        }
        visible: false; // should not be visible on screen.
        layer.enabled: true;
        layer.smooth: true
    }

    Text {
        id: textItem
        font.pixelSize: 48
        text: "Gradient Text"
        anchors.centerIn: parent
        layer.enabled: true
        // This item should be used as the 'mask'
        layer.samplerName: "maskSource"
        layer.effect: ShaderEffect {
            property var colorSource: gradientRect;
            fragmentShader: "
                uniform lowp sampler2D colorSource;
                uniform lowp sampler2D maskSource;
                uniform lowp float qt_Opacity;
                varying highp vec2 qt_TexCoord0;
                void main() {
                    gl_FragColor =
                        texture2D(colorSource, qt_TexCoord0)
                        * texture2D(maskSource, qt_TexCoord0).a
                        * qt_Opacity;
                }
            "
        }
    }

Модуль Qt Графические эффекты содержит несколько готовых эффектов для использования с приложениями Qt Quick.

Примечание: Текстуры графа сцены имеют начало в верхнем левом углу, а не в нижнем левом, как это обычно бывает в OpenGL.

Дополнительную информацию о используемой версии GLSL см. в QtQuick::OpenGLInfo.

См. также Слои элементов.

Документация по свойствам

blending : bool

Если это свойство равно true, результат из fragmentShader смешивается с фоном с использованием режима source-over. Если false, фон игнорируется. Смешивание снижает производительность, поэтому вы должны установить это свойство в false, когда смешивание не требуется. Значение по умолчанию — true.

cullMode : перечисление

Это свойство определяет, какие стороны элемента должны быть видимыми.

  • ShaderEffect.NoCulling - Обе стороны видны
  • ShaderEffect.BackFaceCulling - только лицевая сторона видна
  • ShaderEffect.FrontFaceCulling - только задняя сторона видна

По умолчанию — NoCulling.

fragmentShader : строка

Это свойство содержит исходный код фрагментного шейдера GLSL. Шейдер по умолчанию передает текстурную координату в фрагментный шейдер как "varying highp vec2 qt_TexCoord0".

log : строка

Это свойство содержит журнал предупреждений и ошибок последней попытки компиляции и компоновки программы OpenGL шейдера. Оно обновляется в то же время, что и status устанавливается в Compiled или Error.

См. также status.

mesh : значение

Это свойство определяет сетку, используемую для отрисовки ShaderEffect. Оно может содержать любой объект GridMesh. Если размер присваивается этому свойству, ShaderEffect неявно использует GridMesh с значением в качестве разрешения сетки. По умолчанию это свойство имеет размер 1x1.

См. также GridMesh.

status : перечисление

Это свойство указывает текущий статус программы OpenGL шейдера.

  • ShaderEffect.Compiled - программа шейдера была успешно скомпилирована и скомпонована.
  • ShaderEffect.Uncompiled - программа шейдера еще не была скомпилирована.
  • ShaderEffect.Error - программа шейдера не смогла скомпилироваться или скомпоноваться.

При установке исходного кода фрагментного или вершинного шейдера статус станет Uncompiled. В первый раз, когда ShaderEffect отрисовывается с новым исходным кодом шейдера, шейдеры компилируются и компонуются, а статус обновляется до Compiled или Error.

См. также log.

supportsAtlasTextures : bool

Установите это свойство в true, чтобы подтвердить, что код вашего шейдера не зависит от qt_MultiTexCoord0, изменяющегося от (0,0) до (1,1) относительно сетки. В этом случае диапазон qt_MultiTexCoord0 будет вместо этого основываться на позиции текстуры в атласе. Это свойство в настоящее время не влияет, если используется меньше или больше одной переменной sampler как входные данные в ваш шейдер.

END_OF_DOCUMENT_MARKER

Это отличается от предоставления униформ qt_SubRect_<name>, так как последнее позволяет рисовать одну или несколько текстур из атласа в одном элементе ShaderEffect, тогда как supportsAtlasTextures позволяет группировать несколько экземпляров компонента ShaderEffect, использующих различные изображения из атласа для отрисовки в одном вызове. Оба предотвращают копирование текстуры из атласа при ссылке на неё элементом ShaderEffect.

Значение по умолчанию — false.

Это свойство QML было добавлено в QtQuick 2.4.

vertexShader : string

Это свойство содержит исходный код GLSL вершинного шейдера. Шейдер по умолчанию ожидает, что координаты текстуры будут переданы из вершинного шейдера как «varying highp vec2 qt_TexCoord0», и он выбирает образец из sampler2D с именем «source».

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qml-qtquick-shadereffect.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API