目录
帧缓冲器¶
Fbo 就像一个离屏窗口。你可以激活 fbo 以渲染到纹理中,并将你的 fbo 用作其他绘制的纹理。
Fbo 充当一个 kivy.graphics.instructions.Canvas。
以下是一个使用fbo绘制彩色矩形的示例:
from kivy.graphics import Fbo, Color, Rectangle
class FboTest(Widget):
def __init__(self, **kwargs):
super(FboTest, self).__init__(**kwargs)
# first step is to create the fbo and use the fbo texture on other
# rectangle
with self.canvas:
# create the fbo
self.fbo = Fbo(size=(256, 256))
# show our fbo on the widget in different size
Color(1, 1, 1)
Rectangle(size=(32, 32), texture=self.fbo.texture)
Rectangle(pos=(32, 0), size=(64, 64), texture=self.fbo.texture)
Rectangle(pos=(96, 0), size=(128, 128), texture=self.fbo.texture)
# in the second step, you can draw whatever you want on the fbo
with self.fbo:
Color(1, 0, 0, .8)
Rectangle(size=(256, 64))
Color(0, 1, 0, .8)
Rectangle(size=(64, 256))
如果你修改了 self.fbo 对象中的任何内容,它将会自动更新。放置该 fbo 的画布也会自动更新。
重新加载FBO内容¶
在 1.2.0 版本加入.
如果OpenGL上下文丢失,那么FBO也会随之丢失。您需要自行重新上传数据。使用:meth:`Fbo.add_reload_observer`添加一个重载函数,该函数将在需要时自动被调用:
def __init__(self, **kwargs):
super(...).__init__(**kwargs)
self.fbo = Fbo(size=(512, 512))
self.fbo.add_reload_observer(self.populate_fbo)
# and load the data now.
self.populate_fbo(self.fbo)
def populate_fbo(self, fbo):
with fbo:
# .. put your Color / Rectangle / ... here
这样,您就可以使用相同的方法进行初始化和重新加载。但这取决于您自己。
- class kivy.graphics.fbo.Fbo(*args, **kwargs)¶
-
with 语句。
- 参数:
- clear_color:元组,默认值为 (0, 0, 0, 0)
定义用于清除帧缓冲区的默认颜色。
- size:元组,默认值为 (1024, 1024)
帧缓冲区的默认大小
- push_viewport:布尔值,默认为 True
如果为True,OpenGL视口将被设置为帧缓冲大小,并在帧缓冲释放时自动恢复。
- with_depthbuffer:布尔值,默认为 False
如果为 True,帧缓冲区将分配一个 Z 缓冲区。
- with_stencilbuffer:布尔值,默认为False
在 1.9.0 版本加入.
如果为 True,帧缓冲区将分配一个模板缓冲区。
- texture:
Texture,默认为 None 如果为 None,将创建一个默认纹理。
备注
在kivy 1.9.0中,不支持同时使用``with_stencilbuffer``和``with_depthbuffer``。
- add_reload_observer(self, callback)¶
添加一个回调函数,在整个图形上下文重新加载后调用。这是您可以在此处将自定义数据重新上传到GPU的地方。
在 1.2.0 版本加入.
- 参数:
- callback: func(context) -> 返回 None
第一个参数将是上下文本身。
- bind(self)¶
将FBO绑定到当前的OpenGL上下文中。`Bind`意味着你启用了帧缓冲,所有绘制操作将在帧缓冲内部进行,直到调用:meth:`release`为止。
当您将图形对象添加到其中时,绑定/释放操作会自动调用。如果您想自行操作帧缓冲,可以这样使用::
self.fbo = FBO() self.fbo.bind() # do any drawing command self.fbo.release() # then, your fbo texture is available at print(self.fbo.texture)
- clear_buffer(self)¶
使用
clear_color清除帧缓冲。在调用此方法之前,您需要自行绑定帧缓冲器:
fbo.bind() fbo.clear_buffer() fbo.release()
- clear_color¶
以(红、绿、蓝、透明度)格式清除颜色。
- get_pixel_color(self, int wx, int wy)¶
获取指定窗口坐标(wx, wy)处像素的颜色。返回结果为RGBA格式。
在 1.8.0 版本加入.
- pixels¶
获取像素纹理,仅限RGBA格式,无符号字节。图像原点位于左下角。
在 1.7.0 版本加入.
- release(self)¶
释放帧缓冲(解除绑定)。
- remove_reload_observer(self, callback)¶
从观察者列表中移除之前通过
add_reload_observer()添加的回调。在 1.2.0 版本加入.
- size¶
帧缓冲区的尺寸,格式为(宽度,高度)。
如果您更改大小,帧缓冲区内容将丢失。
- texture¶
返回帧缓冲纹理。