目录
效果部件¶
在 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)之外进行绘制。任何跨越该边界的子控件都将在此处被裁剪。
提供的效果¶
该模块自带多个预写效果。部分效果具有可调属性(如模糊半径)。更多详情请参阅各效果的独立文档。
MonochromeEffect- 使控件变为灰度显示。InvertEffect- 反转控件的颜色。ChannelMixEffect- 交换颜色通道。ScanlinesEffect- 显示闪烁的扫描线效果。PixelateEffect- 将图像像素化。HorizontalBlurEffect- 水平方向进行高斯模糊。VerticalBlurEffect- 垂直方向进行高斯模糊。FXAAEffect- 应用一种非常基础的反锯齿效果。
创建效果¶
效果的设计旨在让创建和使用您自己的变换变得简单。您可以通过创建并使用一个带有自定义 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)[源代码]¶
-
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)[源代码]¶
-
具有对其子项应用一系列图形效果能力的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 版本加入.
- widget:
>>> 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,默认值为 []。
- remove_widget(*args, **kwargs)[源代码]¶
从该部件的子部件中移除一个部件。
- 参数:
- widget:
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。