纹理

在 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'。

Texture 是一个处理 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初始化之前使用Texture会导致崩溃。如果你需要在应用程序启动前创建纹理,请先导入Window:from kivy.core.window import Window

将自定义数据直接绘制到屏幕上。

你可以使用 Texture.blit_buffer() 方法,将自定义数据直接绘制到纹理上。

例如,要绘制不可变字节数据::

# create a 64x64 texture, defaults to rgba / ubyte
texture = Texture.create(size=(64, 64))

# create 64x64 rgb tab, and fill with values from 0 to 255
# we'll have a gradient from black to white
size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]

# then, convert the array to a ubyte string
buf = bytes(buf)

# then blit the buffer
texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')

# that's all ! you can use it in your graphics now :)
# if self is a widget, you can do this
with self.canvas:
    Rectangle(texture=texture, pos=self.pos, size=(64, 64))

自1.9.0版本起,您可以blit(位块传输)存储在实现了Python缓冲区接口的实例中的数据,或其memoryview,例如numpy数组、Python的`array.array`、`bytearray`或Cython数组。如果您预期会blit相似的数据,且数据中可能仅有少量变化,这将非常有益。

当使用数据的字节表示时,每次更改都需要从可能的列表中重新生成字节实例,这非常低效。而使用缓冲区对象时,你可以直接编辑原始数据的部分内容。同样,除非从字节对象开始,否则转换为字节需要完整复制;然而,使用缓冲区实例时,除了上传到GPU外,不会复制任何内存。

继续上述示例:

from array import array

size = 64 * 64 * 3
buf = [int(x * 255 / size) for x in range(size)]
# initialize the array with the buffer values
arr = array('B', buf)
# now blit the array
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')

# now change some elements in the original array
arr[24] = arr[50] = 99
# blit again the buffer
texture.blit_buffer(arr, colorfmt='rgb', bufferfmt='ubyte')

BGR/BGRA 支持

首次尝试创建BGR或BGRA纹理时,我们会通过检查扩展'GL_EXT_bgra'来验证您的硬件是否支持BGR/BGRA纹理。

如果未找到该扩展,则转换为 RGB / RGBA 将在软件中完成。

NPOT纹理

在 1.0.7 版本发生变更: 如果你的硬件支持NPOT,则不会创建POT。

正如OpenGL文档所述,纹理尺寸必须是2的幂。这意味着你的宽度和高度可以是64、32、256等,但不能是3、68、42。NPOT指的是非2的幂。OpenGL ES 2原生支持NPOT纹理,但存在一些缺点。另一种类型的NPOT纹理称为矩形纹理。POT、NPOT以及所有纹理各有其优缺点。

功能特性

好的,请发送需要翻译的英文内容。

NPOT(非二次幂纹理)

矩形

OpenGL 目标

GL_TEXTURE_2D

GL_TEXTURE_2D

GL_TEXTURE_RECTANGLE_(NV|ARB|EXT)

纹理坐标

0-1范围

0-1范围

宽高范围

Mipmapping(多级纹理映射)

支持的

部分地

没有。

包裹模式

支持的

支持的

没有。

如果你创建了一个NPOT纹理,我们首先会通过检查扩展GL_ARB_texture_non_power_of_two或OES_texture_npot来确认你的硬件是否支持它。如果这些扩展都不可用,我们会创建一个能容纳你的NPOT纹理的最接近的POT纹理。此时,Texture.create() 将返回一个 TextureRegion 对象。

纹理图集

纹理图集是一个包含许多图像的单一纹理。如果你想把原始纹理分割成多个单独的纹理,其实并不需要这样做。你可以获取原始纹理的一个区域。这将返回带有自定义纹理坐标的原始纹理::

# for example, load a 128x128 image that contain 4 64x64 images
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)

Mipmapping(多级纹理映射)

在 1.0.7 版本加入.

Mipmapping是一种OpenGL技术,用于增强大型纹理渲染到小型表面的效果。没有mipmapping,在渲染到小型表面时可能会出现像素化现象。其原理是预先计算子纹理,并应用某种图像滤镜作为线性滤镜。这样,当渲染小型表面时,不再使用最大的纹理,而是使用经过滤镜处理的较低分辨率纹理。这样做出来的效果可能会更好。

要实现这一点,你需要在创建纹理时指定 mipmap=True。某些控件已经提供了创建 mipmap 纹理的能力,例如 LabelImage

根据OpenGL Wiki:“因此,一个64x16的2D纹理可以有5个mip-map级别:32x8、16x4、8x2、4x1、2x1和1x1”。更多信息请参阅 http://www.opengl.org/wiki/Texture

备注

如前一节表格所述,若您的纹理为非2的幂(NPOT),我们将创建最接近的2的幂(POT)纹理并从中生成mipmap。此行为未来可能会有所改变。

重新加载纹理

在 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)

    # and load the data now.
    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')

基类:object

基于ImageData的纹理或复杂纹理。

add_reload_observer(self, callback)

添加一个回调函数,在整个图形上下文重新加载后调用。这是你可以将自定义数据重新上传到GPU的地方。

在 1.2.0 版本加入.

参数:
callback:func(context) -> 返回 None

第一个参数将是上下文本身。

ask_update(self, callback)

指示纹理内容应被更新,并且当纹理将被使用时需要调用回调函数。

bind(self)

将纹理绑定到当前的OpenGL状态。

blit_buffer(self, pbuffer, size=None, colorfmt=None, pos=None, bufferfmt=None, mipmap_level=0, mipmap_generation=True, int rowlength=0)

将缓冲区内容复制到纹理中。

备注

除非画布因其他更改而更新,否则应调用 ask_update() 来更新纹理。

参数:
pbuffer:字节,或实现了缓冲区接口的类(包括 memoryview)。

包含图像数据的缓冲区。它可以是`bytes`对象,也可以是实现了Python缓冲区接口的类的实例,例如`array.array`、bytearray、numpy数组等。如果不是`bytes`对象,底层缓冲区必须是连续的、仅有一维,并且不能是只读的,即使数据不会被修改,这是出于Cython的限制。有关使用详情,请参阅模块描述。

size:元组,默认为纹理大小

图像的尺寸(宽度,高度)

colorfmt:字符串类型,默认值为 'rgb'

图像格式,可以是 'rgb'、'rgba'、'bgr'、'bgra'、'luminance' 或 'luminance_alpha' 中的一种。

pos:元组,默认值为 (0, 0)

纹理中要 blit 的位置。

bufferfmt:字符串类型,默认值为'ubyte'

数据缓冲区的类型,可以是 'ubyte'、'ushort'、'uint'、'byte'、'short'、'int' 或 'float' 之一。

mipmap_level:整数,默认为0

指明我们将要更新的mipmap级别。

mipmap_generation:布尔值,默认为 True

指示是否需要从第0级重新生成mipmap。

在 1.0.7 版本发生变更: 添加了 mipmap_levelmipmap_generation

在 1.9.0 版本发生变更: pbuffer 现在可以是任何实现了 Python 缓冲区接口及/或其内存视图的类实例。

blit_data(self, 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) 根据尺寸创建一个纹理。

参数:
size:元组,默认值为 (128, 128)

纹理的大小。

colorfmt:字符串类型,默认值为 'rgba'

纹理的颜色格式。可以是 'rgba' 或 'rgb'、'luminance' 或 'luminance_alpha'。在桌面平台上,还可使用其他值:'red'、'rg'。

icolorfmt:字符串类型,默认值为 colorfmt 的值。

纹理的内部格式存储。可以是'rgba'或'rgb'、'luminance'或'luminance_alpha'。在桌面平台上,还有额外的值可用:'r8'、'rg8'、'rgba8'。

bufferfmt:字符串类型,默认值为'ubyte'

纹理的内部缓冲区格式。可以是 'ubyte'、'ushort'、'uint'、'byte'、'short'、'int' 或 'float'。

mipmap:布尔值,默认为 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(self)

水平显示时翻转tex_coords。

在 1.9.0 版本加入.

flip_vertical(self)

为垂直显示翻转tex_coords。

get_region(self, x, y, width, height)

返回由矩形参数(x, y, width, height)定义的纹理部分。返回一个 TextureRegion 实例。

height

返回纹理的高度(只读)。

id

返回纹理的OpenGL ID(只读)。

mag_filter

获取/设置mag filter纹理。可用值:

  • 线性

  • 最近的

关于这些值的行为,请查阅OpenGL文档以获取更多信息:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml

min_filter

获取/设置最小过滤纹理。可用值:

  • 线性

  • 最近的

  • linear_mipmap_linear

  • linear_mipmap_nearest

  • nearest_mipmap_nearest

  • nearest_mipmap_linear

关于这些值的行为,请查阅OpenGL文档以获取更多信息:http://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexParameter.xml

mipmap

如果纹理启用了mipmap,则返回True(只读)。

pixels

获取像素纹理,仅限RGBA格式,无符号字节。图像原点位于左下角。

在 1.7.0 版本加入.

remove_reload_observer(self, callback)

从观察者列表中移除之前通过 add_reload_observer() 添加的回调。

在 1.2.0 版本加入.

save(self, 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

获取/设置环绕纹理。可用值:

  • 重复

  • 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)

基类:Texture

纹理处理。

ask_update(self, callback)
bind(self)
pixels