效果部件

在 1.9.0 版本加入.

EffectWidget 能够对其子部件应用多种精美的图形效果。它通过使用自定义的 OpenGL 片段着色器渲染到一系列 Fbo 实例来实现这一功能。因此,效果几乎可以自由实现任何操作,从反转部件的颜色,到抗锯齿,再到模拟 CRT 显示器的外观!

警告

此代码仍处于实验阶段,其API在未来的版本中可能会有所变动。

基本用法如下:

w = EffectWidget()
w.add_widget(Button(text='Hello!')
w.effects = [InvertEffect(), HorizontalBlurEffect(size=2.0)]

kv 中的等效写法如下:

#: import ew kivy.uix.effectwidget
EffectWidget:
    effects: ew.InvertEffect(), ew.HorizontalBlurEffect(size=2.0)
    Button:
        text: 'Hello!'

效果可以是任意长度的效果列表,它们将按顺序依次应用。

该模块自带一系列预置效果,但界面设计旨在让您轻松创建自己的效果。无需编写完整的GLSL着色器,您只需提供一个基于屏幕输入(如当前像素颜色、当前控件纹理等)的单一函数即可。更多信息请参阅以下章节。

使用指南

EffectWidget 进行缩放并不高效,因为每次缩放事件都会重新创建 Fbo。如果您需要频繁缩放,请考虑采用其他方式。

虽然某些效果具有可调参数,但动画化这些参数并不高效,因为每次都会重建整个着色器。您应改用GLSL统一变量。AdvancedEffectBase 可能使这一过程更为简便。

备注

EffectWidget *无法*在其自身控件区域(pos -> pos + size)之外进行绘制。任何跨越该边界的子控件都将在此处被裁剪。

提供的效果

该模块自带多个预写效果。部分效果具有可调属性(如模糊半径)。更多详情请参阅各效果的独立文档。

创建效果

效果的设计旨在让创建和使用您自己的变换变得简单。您可以通过创建并使用一个带有自定义 EffectBase.glsl 属性的 EffectBase 实例来实现这一点。

glsl 属性是一个字符串,表示部分 GLSL 片段着色器。您可以包含任意数量的函数(该字符串只是简单地拼接进整个着色器中),但它必须实现一个名为 effect 的函数,如下所示:

vec4 effect(vec4 color, sampler2D texture, vec2 tex_coords, vec2 coords)
{
    // ... your code here
    return something;  // must be a vec4 representing the new color
}

完整的着色器会在每个点计算正常的像素颜色,然后调用你的 effect 函数对其进行变换。参数如下:

  • color:当前像素的正常颜色(即纹理在 tex_coords 处采样得到的颜色)。

  • texture:包含控件正常背景的纹理。

  • tex_coords:用于访问纹理的标准纹理坐标。

  • coords:当前像素的像素索引。

着色器代码还可以访问两个有用的统一变量::code:`time`,包含程序启动以来的时间(以秒为单位),以及`:code:resolution`,包含控件的形状(x像素,y像素)。

例如,以下简单字符串(取自`InvertEffect`)将反转输入颜色但将alpha设置为1.0:

vec4 effect(vec4 color, sampler2D texture, vec2 tex_coords, vec2 coords)
{
    return vec4(1.0 - color.xyz, 1.0);
}

你也可以通过自动从文件中加载字符串来设置glsl,只需设置效果的 EffectBase.source 属性即可。

class kivy.uix.effectwidget.AdvancedEffectBase(*args, **kwargs)[源代码]

基类:EffectBase

一个带有额外行为的 EffectBase,用于轻松设置和更新着色器中的统一变量。

该类为方便您实现自定义效果而提供:Kivy 自带的任何效果均未使用它。

除了必须正常提供的基础GLSL字符串外,AdvancedEffectBase 还有一个额外的属性 uniforms,它是一个名称-值对的字典。每当值发生变化时,uniform 变量的新值就会被上传到着色器中。

你仍然必须在glsl字符串的顶部手动声明你的uniform变量。

set_fbo_shader(*args)[源代码]

通过将 glsl 字符串拼接成一个完整的片段着色器,来设置 Fbo 的着色器。

完整着色器由 shader_header + shader_uniforms + self.glsl + shader_footer_effect 组成。

uniforms

一个字典,包含统一的变量名及其对应的值。这些值在适当的情况下会自动上传到 fbo 着色器中。

uniforms 是一个 DictProperty,默认值为 {}。

class kivy.uix.effectwidget.ChannelMixEffect(*args, **kwargs)[源代码]

基类:EffectBase

根据order属性混合输入的颜色通道。通道可以任意重新排列或重复。

order

rgb 通道的新排序顺序。

order 是一个 ListProperty,默认值为 [1, 2, 0],对应于 (g, b, r)。

class kivy.uix.effectwidget.EffectBase(*args, **kwargs)[源代码]

基类:EventDispatcher

GLSL效果的基础类。它直接返回其输入。

请参阅模块文档以获取更多详细信息。

fbo

当前正在使用此效果的fbo。:class:`EffectBase`会自动处理这一点。

fbo 是一个 ObjectProperty,默认值为 None。

glsl

定义效果函数的GLSL字符串。更多细节请参阅模块文档。

glsl 是一个 StringProperty,默认值为一个返回其输入的简单效果。

set_fbo_shader(*args)[源代码]

通过将 glsl 字符串拼接成一个完整的片段着色器,来设置 Fbo 的着色器。

完整着色器由 shader_header + shader_uniforms + self.glsl + shader_footer_effect 组成。

source

(可选)从中加载 glsl 字符串的文件名。

source 是一个 StringProperty,默认值为 ''。

class kivy.uix.effectwidget.EffectWidget(**kwargs)[源代码]

基类:RelativeLayout

具有对其子项应用一系列图形效果能力的Widget。有关设置效果及创建自定义效果的更多信息,请参阅模块文档。

add_widget(*args, **kwargs)[源代码]

将一个新部件添加为此部件的子部件。

参数:
widget: Widget

要添加到我们子控件列表中的控件。

index:整数,默认为0

在列表中插入widget的索引。请注意,默认值0意味着widget被插入到列表的开头,因此会绘制在其他同级widget之上。关于索引和widget层级结构的完整讨论,请参阅:doc:Widgets编程指南 <guide/widgets>

在 1.0.5 版本加入.

canvas: 字符串,默认为 None

用于添加控件画布的Canvas。可以是'before'、'after'或None以使用默认画布。

在 1.9.0 版本加入.

>>> from kivy.uix.button import Button
>>> from kivy.uix.slider import Slider
>>> root = Widget()
>>> root.add_widget(Button())
>>> slider = Slider()
>>> root.add_widget(slider)
background_color

这定义了在EffectWidget中用于fbo的背景颜色。

background_color 是一个 ListProperty,默认值为 (0, 0, 0, 0)。

clear_widgets(*args, **kwargs)[源代码]

移除该部件的所有(或指定的):attr:~Widget.children。如果指定了'children'参数,它应为当前部件子项的一个列表(或过滤后的列表)。

在 1.8.0 版本发生变更: children 参数可用于指定你想要移除的子组件。

在 2.1.0 版本发生变更: 指定一个空的 children 列表不会改变现有控件。此前,它会被视为 None,从而移除所有子控件。

effects

要应用的所有效果列表。这些应为 EffectBase 的实例或子类。

effects 是一个 ListProperty,默认值为 []。

fbo_list

(内部)用于应用效果的所有FBO列表。

fbo_list 是一个 ListProperty,默认值为 []。

refresh_fbo_setup(*args)[源代码]

(内部)为每个效果创建并分配一个 Fbo,并确保所有尺寸等属性正确且一致。

remove_widget(*args, **kwargs)[源代码]

从该部件的子部件中移除一个部件。

参数:
widget: Widget

要从我们的子控件列表中移除的控件。

>>> from kivy.uix.button import Button
>>> root = Widget()
>>> button = Button()
>>> root.add_widget(button)
>>> root.remove_widget(button)
texture

所有效果应用后,最终 Fbo 的输出纹理。

texture 是一个 ObjectProperty,默认值为 None。

class kivy.uix.effectwidget.FXAAEffect(*args, **kwargs)[源代码]

基类:EffectBase

通过fxaa应用非常简单的抗锯齿效果。

class kivy.uix.effectwidget.HorizontalBlurEffect(*args, **kwargs)[源代码]

基类:EffectBase

size 给定的宽度水平模糊输入。

size

模糊宽度(以像素为单位)。

size 是一个 NumericProperty,默认值为 4.0。

class kivy.uix.effectwidget.InvertEffect(*args, **kwargs)[源代码]

基类:EffectBase

反转输入中的颜色。

class kivy.uix.effectwidget.MonochromeEffect(*args, **kwargs)[源代码]

基类:EffectBase

以单色返回其输入颜色。

class kivy.uix.effectwidget.PixelateEffect(*args, **kwargs)[源代码]

基类:EffectBase

根据其 pixel_size 属性对输入进行像素化处理。

pixel_size

设置效果中新“像素”的大小,以“真实”像素的数量为单位。

pixel_size 是一个 NumericProperty,默认值为 10。

class kivy.uix.effectwidget.ScanlinesEffect(*args, **kwargs)[源代码]

基类:EffectBase

为输入添加扫描线效果。

class kivy.uix.effectwidget.VerticalBlurEffect(*args, **kwargs)[源代码]

基类:EffectBase

size 给定的宽度垂直模糊输入。

size

模糊宽度(以像素为单位)。

size 是一个 NumericProperty,默认值为 4.0。