Тип QML ShaderEffect
Применяет пользовательские шейдеры к прямоугольнику Подробнее...
| Заявление об импорте: | import QtQuick 2.5 |
| Наследует: |
Свойства
- 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