ShaderEffectSource QML 类型

Qt Quick 元素绘制到纹理中并显示出来。 更多...

导入语句import QtQuick
继承

Item

属性

方法

详细描述

ShaderEffectSource 类型将 sourceItem 绘制到纹理中并在场景中显示出来。 sourceItem 被绘制到纹理中就像它是一个完全不透明的根元素。因此,sourceItem 本身可以是不可见的,但仍然出现在纹理中。

ShaderEffectSource 可以用作

  • ShaderEffect 的纹理源。这允许您将自定义着色器效果应用到任何 Qt Quick 元素上。
  • 复杂元素的缓存。可以将复杂元素绘制一次到纹理中,然后可以自由地对该纹理进行动画处理,无需在每一帧再次渲染复杂元素。
  • 不透明层。ShaderEffectSource 允许您将不透明度应用到元素作为一个组,而不是单个元素。

import QtQuick 2.0

Rectangle {
    width: 200
    height: 100
    gradient: Gradient {
        GradientStop { position: 0; color: "white" }
        GradientStop { position: 1; color: "black" }
    }
    Row {
        opacity: 0.5
        Item {
            id: foo
            width: 100; height: 100
            Rectangle { x: 5; y: 5; width: 60; height: 60; color: "red" }
            Rectangle { x: 20; y: 20; width: 60; height: 60; color: "orange" }
            Rectangle { x: 35; y: 35; width: 60; height: 60; color: "yellow" }
        }
        ShaderEffectSource {
            width: 100; height: 100
            sourceItem: foo
        }
    }
}

ShaderEffectSource 类型不会将任何鼠标或键盘输入重定向到 sourceItem。如果您通过将 visible 设置为 false 或 opacity 设置为零来隐藏 sourceItem,它将不再响应输入。在 ShaderEffectSource 意味着要替换 sourceItem 的情况下,您通常希望隐藏 sourceItem 同时处理输入。为此,您可以使用 hideSource 属性。

注意: ShaderEffectSource依赖于FBO多采样支持来抗锯齿边缘。如果底层硬件不支持这一点,这通常是大多数嵌入式图形芯片的情况,那么在ShaderEffectSource内渲染的边缘将不会抗锯齿。解决这个问题的一种方法是将效果源的尺寸加倍,并使用smooth: true进行渲染(这是smooth的默认值)。这相当于4x多采样,但会降低性能和占用更多内存。

警告: 在大多数情况下,使用ShaderEffectSource会降低性能,并且在任何情况下都会增加视频内存的使用量。通过ShaderEffectSource进行渲染还可能导致质量降低,因为一些OpenGL实现支持多采样后的后缓存,但不是多采样帧缓存对象。

属性文档

format : 枚举

此属性定义了支持纹理的格式。在将项目用作ShaderEffect的源纹理时修改此属性最有意义。

常数描述
ShaderEffectSource.RGBA8 
ShaderEffectSource.RGBA16F 
ShaderEffectSource.RGBA32F 
ShaderEffectSource.Alpha从Qt 6.0开始,此值不再使用,其效果与RGBA8相同。
ShaderEffectSource.RGB从Qt 6.0开始,此值不再使用,其效果与RGBA8相同。
ShaderEffectSource.RGBA从Qt 6.0开始,此值不再使用,其效果与RGBA8相同。

hideSource : 布尔

如果此属性为真,则隐藏sourceItem,尽管它仍会渲染到纹理中。与通过将visible设置为false来隐藏sourceItem不同,将此属性设置为true不会阻止鼠标或键盘输入到达sourceItem。当ShaderEffectSource锚定在顶部并且旨在替换sourceItem时,此属性很有用。


live : 布尔

如果此属性为真,则纹理更新与sourceItem的更新同时发生。否则,即使分配了新项目,它也将是一个冻结图像。默认是此属性为真。


mipmap : 布尔

如果此属性为真,将为纹理生成缩放贴图。

注意: 一些OpenGL ES 2实现不支持非2的幂次纹理的缩放贴图。


recursive : 布尔

如果ShaderEffectSource本身有依赖性,则将此属性设置为true。ShaderEffectSources形成一个依赖链,其中某个ShaderEffectSource可以是另一个ShaderEffectSource的源。如果该链中有循环,一个ShaderEffectSource可能会尝试将其使用的纹理进行渲染,这是OpenGL不允许的。当此属性设置为true时,将分配额外的纹理,以便ShaderEffectSource可以存储前一个帧的纹理副本。然后它可以将其渲染到一个纹理中,并以前一个帧的纹理作为源。

设置此属性和 live 属性为 true 将导致场景图持续渲染。由于 ShaderEffectSource 依赖于自身,更新它意味着它立即又变得不干净了。


samples : int

此属性允许请求多采样渲染。

默认情况下,如果整个窗口启用了多采样,则始终启用多采样。假设使用的场景图渲染器和底层图形 API 支持。

将值设置为 2、4 等,可以在不启用整个场景的多采样的情况下请求场景的一部分进行多采样渲染。这种方式,多采样仅应用于给定的子树,这可以显著提高性能,因为多采样不会应用于场景的其他部分。

注意:启用多采样可能很昂贵,无论图层的大小如何,因为它涉及硬件和驱动程序相关的性能和内存成本。

注意:此属性仅在支持多采样渲染缓冲区和帧缓冲区复制的情况下起作用。否则值将被静默忽略。


sourceItem : Item

此属性包含要渲染到纹理中的项。当 live 为 true 并将此设置为 null 时,将释放纹理资源。


sourceRect : rect

此属性定义了要将哪个矩形区域渲染到纹理中。源矩形可以大于 sourceItem 本身。如果矩形是 null,这是默认值,整个 sourceItem 将渲染到纹理中。


textureMirroring : enumeration

此属性定义了生成的 OpenGL 纹理应该如何镜像。默认值是 ShaderEffectSource.MirrorVertically。如果生成的纹理由自定义着色器直接访问,如 ShaderEffect 中指定的,则自定义镜像可能很有用。镜像对 ShaderEffectSource 项本身的 UI 表示没有影响。

常数描述
ShaderEffectSource.NoMirroring无镜像
ShaderEffectSource.MirrorHorizontally生成的纹理沿 X 轴翻转。
ShaderEffectSource.MirrorVertically生成的纹理沿 Y 轴翻转。

textureSize : size

此属性包含请求的纹理像素大小。如果它为空,这是默认值,使用源矩形的尺寸。

注意:此值以像素为单位,因为它直接控制纹理对象的大小。

注意:某些平台对帧缓冲对象的大小有限制,这意味着实际纹理大小可能大于请求的尺寸。


wrapMode : enumeration

此属性定义了与纹理关联的 OpenGL 包装模式。当项用作 ShaderEffect 的源纹理时,修改此属性最有意义。

默认值是 ShaderEffectSource.ClampToEdge

常数描述
ShaderEffectSource.ClampToEdge水平垂直 GL_CLAMP_TO_EDGE
ShaderEffectSource.RepeatHorizontally水平 GL_REPEAT,垂直 GL_CLAMP_TO_EDGE
ShaderEffectSource.RepeatVertically水平 GL_CLAMP_TO_EDGE,垂直 GL_REPEAT
ShaderEffectSource.Repeat水平垂直 GL_REPEAT

注意:一些OpenGL ES 2的实现不支持使用非二进制幂纹理的GL_REPEAT环绕模式。


方法文档

scheduleUpdate()

为下一帧调度纹理的重渲染。当live为false时使用此方法来更新纹理。


© 2024 Qt公司有限公司。此处包含的文档贡献权归各自所有者所有。本文件提供的文档符合由自由软件基金会发布的GNU自由文档许可协议版本1.3的规定。Qt及其相关徽标是芬兰及世界其他国家的商标,由Qt公司持有。所有其他商标归其各自所有者所有。