帧缓冲器

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)

基类:RenderContext

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,帧缓冲区将分配一个模板缓冲区。

textureTexture,默认为 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

返回帧缓冲纹理。