Table Of Contents
Текстура¶
Изменено в версии 1.6.0: Добавлена поддержка палитровых текстур на OES: ‘palette4_rgb8’, ‘palette4_rgba8’, ‘palette4_r5_g6_b5’, ‘palette4_rgba4’, ‘palette4_rgb5_a1’, ‘palette8_rgb8’, ‘palette8_rgba8’, ‘palette8_r5_g6_b5’, ‘palette8_rgba4’ и ‘palette8_rgb5_a1’.
Текстура
- это класс, который управляет текстурами OpenGL. В зависимости от
аппаратных возможностей,
некоторые возможности OpenGL могут быть недоступны (поддержка BGRA, поддержка NPOT,
и так далее)
Вы не можете создать этот класс самостоятельно. Вы должны использовать функцию
Texture.create()
для создания новой текстуры:
texture = Texture.create(size=(640, 480))
При создании текстуры вам следует знать о формате цвета и буфера по умолчанию:
формат цвета/пикселя (
Texture.colorfmt
), который может быть одним из ‘rgb’, ‘rgba’, ‘luminance’, ‘luminance_alpha’, ‘bgr’ или ‘bgra’. Значение по умолчанию - ‘rgb’формат буфера определяет, как компонент цвета хранится в памяти. Это может быть одним из ‘ubyte’, ‘ushort’, ‘uint’, ‘byte’, ‘short’, ‘int’ или ‘float’. Значение по умолчанию и наиболее часто используется - ‘ubyte’.
Так что, если вы хотите создать текстуру RGBA:
texture = Texture.create(size=(640, 480), colorfmt='rgba')
Вы можете использовать свою текстуру в большинстве инструкций вершин с
параметром kivy.graphics.VertexIntruction.texture
. Если вы хотите использовать
вашу текстуру в языке kv, вы можете сохранить ее в
ObjectProperty
внутри вашего виджета.
Предупреждение
Использование текстуры перед инициализацией OpenGL приведет к сбою. Если вам нужно создавать текстуры до запуска приложения, импортируйте сначала Window: from kivy.core.window import Window
Перенос пользовательских данных¶
Вы можете создать собственные данные и перенести их на текстуру с помощью
Texture.blit_buffer()
.
Например, чтобы перенести неизменные байтовые данные:
# создать текстуру 64x64, по умолчанию rgba / ubyte
texture =
Texture.create(size=(64, 64))
# создать 64x64 rgb-таблицу и заполнить значениями от 0 до 255
# у нас будет градиент от черного к белому
size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]
# затем преобразовать массив в строку ubyte
buf = bytes(buf)
# затем перенести буфер
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')
# вот и все! теперь вы можете использовать его в графике :)
# если self - это виджет, вы можете сделать это
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(64, 64))
С версии 1.9.0 вы можете переносить данные, хранящиеся в объекте, который реализует интерфейс буфера Python, или в представлении памяти этого объекта, такие как массивы numpy, массивы Python array.array, bytearray или массив Cython. Это полезно, если вы ожидаете переносить похожие данные с небольшими изменениями в данных.
При использовании байтового представления данных при каждом изменении вам придется пересоздавать экземпляр байтов, возможно, из списка, что очень неэффективно. При использовании объекта буфера вы можете просто редактировать части исходных данных. Точно так же, если вы начнете с объекта байтов, преобразование в байты потребует полного копирования, однако при использовании объекта буфера не выполняется никакого копирования памяти, кроме как для его загрузки на GPU.
Продолжая пример выше:
from array import array
size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]
# инициализировать массив значениями буфера
arr = array('B', buf)
# теперь перенести массив
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
# теперь измените некоторые элементы в исходном массиве
arr[24] = arr[50] = 99
# снова перенести буфер
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')
Поддержка BGR/BGRA¶
Первый раз, когда вы пытаетесь создать текстуру BGR или BGRA, мы проверяем, поддерживает ли ваша аппаратура текстуры BGR / BGRA, проверяя расширение ‘GL_EXT_bgra’.
Если расширение не найдено, преобразование в RGB / RGBA будет выполнено в программно.
Текстура NPOT¶
Изменено в версии 1.0.7: Если ваше оборудование поддерживает NPOT, POT не создается.
Как говорит документация OpenGL, текстура должна иметь размер, являющийся степенью двойки. Это означает, что ширина и высота могут быть одними из 64, 32, 256... но не 3, 68, 42. NPOT означает не степенью двойки. OpenGL ES 2 поддерживает текстуры NPOT нативно, но с некоторыми ограничениями. Еще одним типом текстуры NPOT является текстура-прямоугольник. POT, NPOT и текстуры имеют свои собственные плюсы и минусы.
Характеристики |
POT |
NPOT |
Прямоугольник |
OpenGL Target |
GL_TEXTURE_2D |
GL_TEXTURE_2D |
GL_TEXTURE_RECTANGLE_(NV|ARB|EXT) |
Координаты текстуры |
Диапазон 0-1 |
Диапазон 0-1 |
Диапазон ширина-высота |
Мипмаппинг |
Поддерживается |
Частично |
Нет |
Режим обтекания |
Поддерживается |
Поддерживается |
Нет |
Если вы создаете текстуру NPOT, мы сначала проверяем, поддерживает ли ваше оборудование
это, проверяя расширения GL_ARB_texture_non_power_of_two или
OES_texture_npot. Если ни одно из них не доступно, мы создаем ближайшую
POT текстуру, которая может содержать вашу текстуру NPOT. Texture.create()
вернет вместо этого TextureRegion
.
Атлас текстур¶
Атлас текстур - это одиночная текстура, содержащая много изображений. Если вы хотите разделить исходную текстуру на много отдельных, вам не нужно. Вы можете получить регион исходной текстуры. Это вернет исходную текстуру с настраиваемыми текстурными координатами:
# Например, загрузите изображение 128x128, содержащее 4 изображения 64x64
from kivy.core.image import Image
texture = Image('mycombinedimage.png').texture
bottomleft = texture.get_region(0, 0, 64, 64)
bottomright = texture.get_region(0, 64, 64, 64)
topleft = texture.get_region(0, 64, 64, 64)
topright = texture.get_region(64, 64, 64, 64)
Мипмаппинг¶
Добавлено в версии 1.0.7.
Мипмаппинг - это техника OpenGL для улучшения рендеринга больших текстур на маленьких поверхностях. Без мипмаппинга вы можете видеть пикселизацию, когда рендерите на маленьких поверхностях. Идея заключается в предварительном вычислении подтекстуры и применении некоторого изображения фильтр в виде линейного фильтра. Затем, когда вы рендерите на маленькой поверхности, вместо использования самой большой текстуры будет использоваться более низкокачественная текстура. Результат может выглядеть лучше таким образом.
Чтобы сделать это, вам нужно указать mipmap=True при создании текстуры.
Некоторые виджеты уже позволяют вам создавать текстуры с мипмаппингом, такие как Label
и
Image
.
Из OpenGL Wiki: "Таким образом, 2D-текстура 64x16 может иметь 5 мип-карт: 32x8, 16x4, 8x2, 4x1, 2x1 и 1x1". Подробнее смотрите на http://www.opengl.org/wiki/Texture.
Примечание
Как указано в таблице в предыдущем разделе, если ваша текстура NPOT, то мы создаем ближайшую текстуру POT и генерируем мипмап из нее. Это может измениться в будущем.
Перезагрузка текстуры¶
Добавлено в версии 1.2.0.
Если контекст OpenGL утерян, текстуру необходимо перезагрузить. Текстуры с источником автоматически перезагружаются, но созданные текстуры должны быть перезагружены пользователем.
Используйте Texture.add_reload_observer()
, чтобы добавить функцию перезагрузки, которая
будет вызываться автоматически при необходимости:
def __init__(self, **kwargs):
super(...).__init__(**kwargs)
self.texture = Texture.create(size=(512, 512), colorfmt='RGB',
bufferfmt='ubyte')
self.texture.add_reload_observer(self.populate_texture)
# и загрузите данные сейчас.
self.cbuffer = '\x00\xf0\xff' * 512 * 512
self.populate_texture(self.texture)
def populate_texture(self, texture):
texture.blit_buffer(self.cbuffer)
Таким образом, вы можете использовать тот же метод для инициализации и перезагрузки.
Примечание
Для всех операций рендеринга текста с нашим ядром рендеринга текста, текстура генерируется, но мы уже привязали метод для повторного рендеринга текста и перезагрузки текст в текстуру. Вам не нужно ничего делать.
- class kivy.graphics.texture.Texture(width, height, target, texid=0, colorfmt='rgb', bufferfmt='ubyte', mipmap=False, source=None, callback=None, icolorfmt='rgb')¶
Базовый класс:
builtins.object
текстуры или сложные текстуры на основе ImageData.
- add_reload_observer(callback)¶
Добавляет обратный вызов для вызова после полной перезагрузки графического контекста. Здесь вы можете повторно загрузить свои собственные данные в GPU.
Добавлено в версии 1.2.0.
- Parameters
- callback: func(context) -> return None
Первый параметр будет самим контекстом.
- ask_update(callback)¶
Запросить обновление содержимого текстуры , и функция обратного вызова должна быть вызвана, когда текстура будет использоваться.
- bind()¶
Привязать текстуру к текущему состоянию OpenGL.
- blit_buffer(pbuffer, size=None, colorfmt=None, pos=None, bufferfmt=None, mipmap_level=0, mipmap_generation=True, int rowlength=0)¶
Перенос буфера в текстуру.
Примечание
Если холст не будет обновляться из-за других изменений,
ask_update()
должен быть вызван для обновления текстуры.- Parameters
- pbuffer: bytes, или класс, реализующий интерфейс буфера (включая memoryview).
Буфер, содержащий данные изображения. Это может быть либо объект bytes, либо экземпляр класса, реализующего интерфейс буфера Python, например, array.array, bytearray, массивы numpy и так далее. Если это не объект bytes, основной буфер должен быть непрерывным, иметь только одну размерность и не должен быть только для чтения, даже если данные не изменяются, из-за ограничений Cython. См. описание модуля для деталей использования.
- size: tuple, по умолчанию размер текстуры
Размер изображения (ширина, высота)
- colorfmt: str, по умолчанию 'rgb'
Формат изображения, может быть 'rgb', 'rgba', 'bgr', 'bgra', 'luminance' или 'luminance_alpha'.
- pos: tuple, по умолчанию (0, 0)
Позиция для переноса на текстуру.
- bufferfmt: str, по умолчанию 'ubyte'
Тип буфера данных, может быть 'ubyte', 'ushort', 'uint', 'byte', 'short', 'int' или 'float'.
- mipmap_level: int, по умолчанию 0
Укажите, какой уровень mipmap мы собираемся обновить.
- mipmap_generation: bool, по умолчанию True
Указывает, нужно ли создавать mipmap с уровня 0.
Изменено в версии 1.0.7: добавлены mipmap_level и mipmap_generation
Изменено в версии 1.9.0: pbuffer теперь может быть экземпляром любого класса, реализующего интерфейс буфера Python, и/или memoryviews.
- blit_data(im, pos=None)¶
Заменяет всю текстуру данными изображения.
- bufferfmt¶
Возвращает формат буфера, используемый в этой текстуре (только для чтения).
Добавлено в версии 1.2.0.
- colorfmt¶
Возвращает формат цвета, используемый в этой текстуре (только для чтения).
Добавлено в версии 1.0.7.
- static create(size=None, colorfmt=None, bufferfmt=None, mipmap=False, callback=None, icolorfmt=None)¶
texture_create(size=None, colorfmt=None, bufferfmt=None, mipmap=False, callback=None, icolorfmt=None) Создать текстуру на основе размера.
- Parameters
- size: tuple, по умолчанию (128, 128)
Размер текстуры.
- colorfmt: str, по умолчанию 'rgba'
Формат цвета текстуры. Может быть 'rgba' или 'rgb', 'luminance' или 'luminance_alpha'. На рабочем столе доступны дополнительные значения: 'red', 'rg'.
- icolorfmt: str, по умолчанию значение colorfmt
Внутренний формат хранения текстуры. Может быть 'rgba' или 'rgb', 'luminance' или 'luminance_alpha'. На рабочем столе доступны дополнительные значения: 'r8', 'rg8', 'rgba8'.
- bufferfmt: str, по умолчанию 'ubyte'
Внутренний формат буфера текстуры. Может быть 'ubyte', 'ushort', 'uint', 'bute', 'short', 'int' или 'float'.
- mipmap: bool, по умолчанию False
Если True, автоматически создается текстура mipmap.
- callback: callable(), по умолчанию False
Если предоставлена функция, она будет вызвана, когда потребуется данные в текстуре.
Изменено в версии 1.7.0: добавлена
callback
- static create_from_data(im, mipmap=False)¶
texture_create_from_data(im, mipmap=False) Создать текстуру из класса ImageData.
- flip_horizontal()¶
Инвертировать tex_coords для горизонтального отображения.
Добавлено в версии 1.9.0.
- flip_vertical()¶
Инвертировать tex_coords для вертикального отображения.
- get_region(x, y, width, height)¶
Возвращает часть текстуры, определенную прямоугольными аргументами (x, y, width, height). Возвращает экземпляр
TextureRegion
.
- height¶
Возвращает высоту текстуры (только для чтения).
- id¶
Возвращает идентификатор OpenGL текстуры (только для чтения).
- mag_filter¶
Получить/установить текстурный магний фильтр. Доступные значения:
линейный
ближайший
Проверьте документацию OpenGL для получения дополнительной информации о поведении этих значений: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml.
- min_filter¶
Получить/установить текстурный минимальный фильтр. Доступные значения:
линейный
ближайший
линейный_mipmap_linear
линейный_mipmap_nearest
ближайший_mipmap_nearest
ближайший_mipmap_linear
Проверьте документацию OpenGL для получения дополнительной информации о поведении этих значений: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml.
- mipmap¶
Возвращает True, если включены уровни mipmap для текстуры (только для чтения).
- pixels¶
Получить пиксели текстуры только в формате RGBA, беззнаковый байт. Начало изображения находится в нижнем левом углу.
Добавлено в версии 1.7.0.
- remove_reload_observer(callback)¶
Удалить обратный вызов из списка наблюдателей, ранее добавленный с помощью
add_reload_observer()
.Добавлено в версии 1.2.0.
- save(filename, flipped=True, fmt=None)¶
Сохранить содержимое текстуры в файле. Проверьте
kivy.core.image.Image.save()
для получения дополнительной информации.Параметр flipped вертикально инвертирует сохраненное изображение и по умолчанию равен True.
Добавлено в версии 1.7.0.
Изменено в версии 1.8.0: Добавлен параметр flipped, который по умолчанию равен True. Все текстуры OpenGL читаются снизу / слева, поэтому перед сохранением их необходимо перевернуть. Если вы не хотите переворачивать изображение, установите flipped в False.
Изменено в версии 1.11.0: Добавлен параметр fmt для передачи окончательного формата провайдера изображения. Используется, если имя файла - это BytesIO
- size¶
Возвращает (ширина, высота) текстуры (только для чтения).
- target¶
Возвращает цель OpenGL для текстуры (только для чтения).
- tex_coords¶
Возвращает список tex_coords (opengl).
- uvpos¶
Получить/установить позицию UV внутри текстуры.
- uvsize¶
Получить/установить размер UV внутри текстуры.
Предупреждение
Размер может быть отрицательным, если текстура перевернута.
- width¶
Возвращает ширину текстуры (только для чтения).
- wrap¶
Получить/установить обертку текстуры. Доступные значения:
repeat
mirrored_repeat
clamp_to_edge
Проверьте документацию OpenGL для получения дополнительной информации о поведении этих значений: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml.
- class kivy.graphics.texture.TextureRegion(int x, int y, int width, int height, Texture origin)¶
Bases:
kivy.graphics.texture.Texture
texture handling.
- ask_update(callback)¶
- bind()¶
- pixels¶