QCanvasCustomBrush Class
QCanvasCustomBrush 是一种带有自定义着色器的画笔。更多...
| 标题: | #include <QCanvasCustomBrush> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| 自: | Qt 6.11 |
| 状态: | 技术预览 |
该类处于技术预览阶段,内容可能会有变动。
公共函数
| QCanvasCustomBrush() | |
| QCanvasCustomBrush(QCanvasCustomBrush &&) | |
| ~QCanvasCustomBrush() | |
| bool | isAnimationRunning() const |
| void | setAnimationRunning(bool running) |
| void | setData1(const QVector4D &data) |
| void | setData2(const QVector4D &data) |
| void | setData3(const QVector4D &data) |
| void | setData4(const QVector4D &data) |
| void | setFragmentShader(const QShader &fragmentShader) |
| void | setFragmentShader(const QString &fragmentShader) |
| void | setVertexShader(const QShader &vertexShader) |
| void | setVertexShader(const QString &vertexShader) |
| operator QVariant() const |
相关的非成员
| bool | operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs) |
| QDataStream & | operator<<(QDataStream &stream, const QCanvasCustomBrush &brush) |
| bool | operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs) |
| QDataStream & | operator>>(QDataStream &stream, QCanvasCustomBrush &brush) |
详细说明
QCanvasCustomBrush 是一种带有自定义顶点和/或片段着色器的描边/填充画笔。
这些着色器应采用 Vulkan 风格的 GLSL 编写,与Qt Quick 中的ShaderEffect 着色器类似。它们必须始终包含一个QC_INCLUDE 语句,且该语句应使用"customfrag.glsl" 或"customvert.glsl" 之一。这将提供一个 uniform 块、图像和字体纹理以及一些辅助函数。
iTime 是内置uniform块中常用成员的一个示例。在true 环境下调用setAnimationRunning(),该值将每帧自动更新,可用于驱动动画内容。
内置着色器输入、统一变量和辅助函数
QC_INCLUDE 语句并非标准的预处理器指令。它在构建时由qt_add_custom_brush_shaders()处理,此时着色器尚未被传递到常规的着色器编译管道中。 该语句将被替换为一段 GLSL 源代码,其中声明了着色器的输入和输出、纹理采样器、一个共享统一变量块,以及(对于片段着色器)一组辅助函数。在顶点着色器中使用 `"customvert.glsl" `,在片段着色器中使用 `"customfrag.glsl" `。
这意味着自定义笔刷着色器无需自行声明这些输入、输出、采样器或统一变量;它们均由QC_INCLUDE 语句提供。
顶点着色器接口
包含"customvert.glsl" 的顶点着色器会声明以下输入和输出:
in vec2 vertex- 画布坐标系中的顶点位置。in vec2 tcoord- 与顶点关联的纹理坐标。out vec2 texCoord- 转发至片段着色器。通常设置为 `tcoord`。out vec2 fragCoord- 转发至片段着色器。通常设置为 `vertex`。
注意:这些 变量可通过 `QC_INCLUDE ` 指令隐式获取。顶点着色器代码片段本身不得声明它们。
此外,还可使用以下与变换相关的统一变量:
vec4 viewRect- 视口矩形,格式为 (x, y, width, height)。int ndcIsYDown- 当归一化设备坐标系的 Y 轴指向下方时(某些图形 API 即为此情况),该值不为零。计算gl_Position时请考虑这一点。mat3 vertMatrix- 当前变换矩阵。
顶点着色器必须写入gl_Position ,并应将texCoord 和fragCoord 转发至片段着色阶段。
注意:自定义 顶点着色器较为少见。大多数自定义画笔通常会使用默认的内置顶点着色器,并结合应用程序提供的自定义片段着色器。
典型的顶点着色器如下所示:
#version 440
QC_INCLUDE "customvert.glsl"
void main()
{
texCoord = tcoord;
fragCoord = vertex;
vec2 v = (vertMatrix * vec3(vertex, 1.0)).xy;
if (ndcIsYDown != 0)
gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
-1.0 + 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
else
gl_Position = vec4(2.0 * (v.x + viewRect.x) / viewRect.z - 1.0,
1.0 - 2.0 * (v.y + viewRect.y) / viewRect.w, 0.0, 1.0);
}片段着色器接口
包含"customfrag.glsl" 的片段着色器声明了以下输入和输出:
in vec2 texCoord- 插值后的纹理坐标。in vec2 fragCoord- 插值后的片段位置,与几何体处于同一坐标系中。通常用于驱动程序化效果。out vec4 fragColor- 生成的片段颜色,着色器必须将其写入。预期输出采用预乘透明度(premultiplied alpha)。
注意:这些 变量可通过QC_INCLUDE 指令隐式获取。片段着色器代码片段本身不得声明这些变量。
提供两种纹理采样器:
sampler2D tex- 图像纹理。sampler2D fontTex- 字体纹理,其中包含字符的有符号距离场。当使用画笔填充文本时,此纹理相关。
还定义了便利常量TAU (等于2 * pi)和SQRT2 。
常用统一变量
使用QC_INCLUDE 的顶点着色器和片段着色器均可访问一个共享的统一变量块。最常用的成员包括:
float iTime- 一个以秒为单位的时间值,当isAnimationRunning() 为true时,该值会在每帧更新。用于驱动动画。参见setAnimationRunning()。vec4 data1,vec4 data2,vec4 data3,vec4 data4- 向着色器公开的自定义数据。可通过 C++ 中的setData1()、setData2()、setData3() 和setData4() 进行设置。float globalAlpha- 绘制器当前的全局不透明度。片段着色器通常应将 `fragColor` 与该值相乘。vec4 colorEffects- 当前有效的颜色效果参数。通常通过 applyColorEffects() 应用,而非直接访问。float fontAlphaMin,float fontAlphaMax- 抗锯齿字形时使用的带符号距离场阈值。
片段着色器辅助函数
片段着色器头文件提供了以下辅助函数:
float clipMask()- 返回当前片段的裁剪(剪切)覆盖范围,范围为 [0, 1]。将fragColor乘以该值以遵守绘制器的裁剪规则。float antialiasingAlpha()- 返回基于 `texCoord` 计算的抗锯齿覆盖度,取值范围为 [0, 1]。将 `fragColor` 乘以该值可获得经过抗锯齿处理的边缘。float sdfFontAlphaRaw()- 返回从fontTex在texCoord处采样的原始有符号距离场值,不包含抗锯齿处理。请根据需要手动应用smoothstep()。float sdfFontAlpha()- 返回从fontTex在坐标texCoord处采样的字形透明度,并应用基于fontAlphaMin和fontAlphaMax的默认抗锯齿处理。void applyColorEffects(inout vec4 color)- 将当前激活的对比度、亮度和饱和度效果直接应用于color。
典型的片段着色器会计算fragColor ,将其与globalAlpha 相乘,可选地乘以clipMask() 和antialiasingAlpha() 以支持剪裁和抗锯齿,最后调用 applyColorEffects()。
当涉及文本时,还应将sdfFontAlpha() 考虑在内。例如:
#version 440
QC_INCLUDE "customfrag.glsl"
void main()
{
float a = 0.6 + 0.2 * sin(0.1 * fragCoord.x + 4.0 * iTime);
vec4 color = vec4(a, a, a, 1.0);
fragColor = sdfFontAlpha() * globalAlpha * color;
applyColorEffects(fragColor);
}将着色器添加到项目中
与 QCanvasCustomBrush 配合使用的着色器必须始终通过 Qt Canvas Painter 包提供的qt_add_custom_brush_shadersCMake 函数添加到应用程序项目中。该函数在构建时执行额外的预处理,然后在内部调用标准的qt_add_shaders() 。
例如:
qt_add_custom_brush_shaders(app "app_custombrush_shaders"
PREFIX
"/shaders"
FILES
brush1.frag
)使用画笔
在运行时,可以像这样使用生成的.qsb 文件:
QCanvasCustomBrush customBrush(":/shaders/brush1.frag.qsb"));
customBrush.setAnimationRunning(true); // iTime updates automatically
// expose custom data to the shader in data1
customBrush.setData1(QVector4D(1.0, 2.0, 3.0, 4.0));随后,QCanvasCustomBrush 即可用于填充操作,例如:
painter->setFillStyle(customBrush);有关该 CMake 函数的详细信息,请参阅qt_add_custom_brush_shaders;关于在 Qt 中处理跨平台着色器代码的详细信息,请参阅QtShader Tools 模块的文档。
注意: 自定义画笔的着色器 必须始终包含QC_INCLUDE 语句,并且必须通过qt_add_custom_brush_shadersCMake 函数添加到项目中。qt_add_shaders() 不适用于自定义画笔着色器。
注意:qt_add_custom_brush_shaders 会将着色器代码转换为以下目标:GLSL300 es 、150 、130 、HLSL5.0 以及 MSL1.2 。目前对此不提供进一步的可配置选项。
另请参阅 qt_add_custom_brush_shaders和Qt Canvas Painter - 画廊示例。
成员函数文档
QCanvasCustomBrush::QCanvasCustomBrush()
创建一个默认的自定义画笔。
[constexpr noexcept default] QCanvasCustomBrush::QCanvasCustomBrush(QCanvasCustomBrush &&)
通过Move构造一个QCanvasCustomBrush 实例。
[noexcept] QCanvasCustomBrush::~QCanvasCustomBrush()
删除自定义画笔。
bool QCanvasCustomBrush::isAnimationRunning() const
如果时间正在运行,则返回 true。
void QCanvasCustomBrush::setAnimationRunning(bool running)
将时间运行状态设置为running 。当该值设为true时,着色器统一变量iTime 会自动更新,可用于在着色器中获取当前动画的运行时间。
默认值为 `false`。
另请参阅 isAnimationRunning()。
void QCanvasCustomBrush::setData1(const QVector4D &data)
将统一变量 data1 的值设置为data 。这允许将自定义数据写入着色器。
void QCanvasCustomBrush::setData2(const QVector4D &data)
将统一数据2的值设置为data 。这允许将自定义数据设置到着色器中。
void QCanvasCustomBrush::setData3(const QVector4D &data)
将uniform data3的值设置为data 。这允许将自定义数据设置到着色器中。
void QCanvasCustomBrush::setData4(const QVector4D &data)
将uniform数据4的值设置为data 。这允许在着色器中设置自定义数据。
void QCanvasCustomBrush::setFragmentShader(const QShader &fragmentShader)
将自定义画笔设置为使用fragmentShader 。
void QCanvasCustomBrush::setFragmentShader(const QString &fragmentShader)
将自定义画笔设置为使用fragmentShader 。此路径必须指向一个有效的qsb文件。该文件可以是本地文件,也可以通过Qt资源系统嵌入到应用程序中。
void QCanvasCustomBrush::setVertexShader(const QShader &vertexShader)
将自定义画笔设置为使用“vertexShader ”。
void QCanvasCustomBrush::setVertexShader(const QString &vertexShader)
将自定义画笔设置为使用vertexShader 。此路径必须指向一个有效的qsb文件。该文件可以是本地文件,也可以通过Qt资源系统嵌入到应用程序中。
QCanvasCustomBrush::operator QVariant() const
将自定义画笔作为QVariant 返回。
相关的非成员
[noexcept] bool operator!=(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
如果自定义画笔lhs 与rhs 不相同,则返回true ;否则返回false 。
另请参阅 operator==()。
QDataStream &operator<<(QDataStream &stream, const QCanvasCustomBrush &brush)
将给定的brush 写入给定的stream ,并返回对stream 的引用。
注意:此 函数对从 .qsb 文件加载的着色器进行序列化,而非文件名。
另请参阅 《Qt 数据类型的序列化》。
[noexcept] bool operator==(const QCanvasCustomBrush &lhs, const QCanvasCustomBrush &rhs)
如果自定义画笔lhs 等于rhs ,则返回true ;否则返回false 。
另请参阅 operator!=()。
QDataStream &operator>>(QDataStream &stream, QCanvasCustomBrush &brush)
从给定的stream 中读取指定的brush ,并返回对stream 的引用。
另请参阅 《Qt 数据类型的序列化》。
© 2026 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.