Версия 2.1.0

Quick search

Framebuffer

Fbo (Frame Buffer Object) представляет собой что-то вроде оффскрин-окна. Вы можете активировать 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 также потерян. Вам нужно будет самостоятельно перезагрузить данные. Используйте 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)

    # и загрузите данные сейчас.
    self.populate_fbo(self.fbo)


def populate_fbo(self, fbo):
    with fbo:
        # .. поместите здесь ваши Color / Rectangle / ...

Таким образом, вы можете использовать тот же метод как для инициализации, так и для перезагрузки. Но это зависит от вас.

class kivy.graphics.fbo.Fbo(*args, **kwargs)

Базовый класс: kivy.graphics.instructions.RenderContext

Инструкция "with".

Parameters
clear_color: кортеж, значение по умолчанию (0, 0, 0, 0)

Определите цвет по умолчанию для очистки буфера кадра

size: кортеж, значение по умолчанию (1024, 1024)

Размер буфера кадра по умолчанию

push_viewport: логическое значение, значение по умолчанию True

Если True, то размер видового окна OpenGL будет установлен в размер буфера кадра и будет автоматически восстановлен при освобождении буфера кадра.

with_depthbuffer: логическое значение, значение по умолчанию False

Если True, то буфер кадра будет выделен с буфером глубины.

with_stencilbuffer: логическое значение, значение по умолчанию False

Добавлено в версии 1.9.0.

Если True, то буфер кадра будет выделен с буфером трафарета.

texture: Texture, значение по умолчанию None

Если None, то будет создана текстура по умолчанию.

Примечание

Использование и with_stencilbuffer и with_depthbuffer одновременно не поддерживается в kivy 1.9.0

add_reload_observer(callback)

Добавьте обратный вызов, который будет вызываться после того, как весь графический контекст будет перезагружен. Здесь вы можете повторно загрузить свои пользовательские данные в GPU.

Добавлено в версии 1.2.0.

Parameters
callback: функция (контекст) -> возврат None

Первый параметр будет самим контекстом

bind()

Привяжите FBO к текущему контексту OpenGL. Привязка означает, что вы активируете буфер кадра, и все операции рисования будут выполняться внутри буфера кадра до вызова release(). Операции привязки/освобождения вызываются автоматически, когда вы добавляете графические объекты в него. Если вы хотите вручную управлять буфером кадра, вы можете использовать его так:

self.fbo = FBO()
self.fbo.bind()
# выполните любую команду рисования
self.fbo.release()

# затем ваша текстура fbo доступна по адресу
print(self.fbo.texture)
clear_buffer()

Очистите буфер кадра с помощью clear_color.

Вы должны связать буфер кадра самостоятельно перед вызовом этого метода:

fbo.bind()
fbo.clear_buffer()
fbo.release()
clear_color

Цвет очистки в формате (красный, зеленый, синий, альфа).

get_pixel_color(int wx, int wy)

Получите цвет пикселя с указанными координатами окна wx, wy. Возвращает результат в формате RGBA.

Добавлено в версии 1.8.0.

pixels

Получите текстуру пикселей в формате RGBA только с беззнаковыми байтами. Начало изображения находится в нижнем левом углу.

Добавлено в версии 1.7.0.

release()

Освободите буфер кадра (unbind).

remove_reload_observer(callback)

Удалите обратный вызов из списка наблюдателей, ранее добавленный с помощью add_reload_observer().

Добавлено в версии 1.2.0.

size

Размер буфера кадра в формате (ширина, высота).

Если вы измените размер, содержимое буфера кадра будет потеряно.

texture

Верните текстуру буфера кадра