目录
- 纹理
- 将自定义数据直接绘制到屏幕上。
- BGR/BGRA 支持
- NPOT纹理
- 纹理图集
- Mipmapping(多级纹理映射)
- 重新加载纹理
TextureTexture.add_reload_observer()Texture.ask_update()Texture.bind()Texture.blit_buffer()Texture.blit_data()Texture.bufferfmtTexture.colorfmtTexture.create()Texture.create_from_data()Texture.flip_horizontal()Texture.flip_vertical()Texture.get_region()Texture.heightTexture.idTexture.mag_filterTexture.min_filterTexture.mipmapTexture.pixelsTexture.remove_reload_observer()Texture.save()Texture.sizeTexture.targetTexture.tex_coordsTexture.uvposTexture.uvsizeTexture.widthTexture.wrap
TextureRegion
纹理¶
在 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 纹理的能力,例如 Label 和 Image。
根据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_level 和 mipmap_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¶