2016年9月22日
引入外部位图纹理
Corona 的工程师们最近做了一些很棒的事情,尤其是在图形引擎方面。其中一项是允许插件创建者和 Corona Enterprise 用户将纹理直接推送到 Corona 图形管道中的功能,从而有效地提供位图数据。生成的纹理的行为将类似于由 graphics.newTexture() 创建的纹理。
表面之下
通常使用 Corona 显示 API 时,图像会被加载,纹理在内存中创建,并通过图形处理单元 (GPU) 进行处理。一旦图像进入该领域,就很难进行像素级的操作——设置和获取单个像素信息是一项耗时的操作,这使得它对于大多数操作来说是不切实际的。
幸运的是,Corona 图形 API 集提供了从基于 C 的插件创建具有自定义数据的纹理的功能。生成的对象继承了 TextureResourceExternal 以及 TextureResource 的属性。一旦创建,这些对象将具有 filename
和 baseDir
属性,这些属性可以在任何 display API 中使用或用于分配填充。
可能性?
一个可能利用这些功能的插件示例是加载 SVG(可缩放矢量图形)文件,在原生 C 端对其进行栅格化,并将结果推送到 Corona 以返回纹理对象的插件。然后,该纹理对象可用于创建典型的显示对象。
其他示例包括基于 ImageMagick 或其他 C 库的图像处理插件、自定义文本和字体渲染器,以及从不支持的格式导入图像——可能性是无限的!
进行测试!
为了演示这项技术,我们的工程师创建了一个非常简单的插件,名为 memoryBitmap。此插件在 Corona 市场中提供,它只有一个方法 memoryBitmap.newTexture()。这会创建一个指定尺寸的空白纹理,结果是一个新的 TextureResourceExternal 对象,其中包含两个附加方法::setPixel() 和 :getPixel()。
直接“开箱即用”,此插件对于 Corona SDK 开发人员来说并不是特别有用,因为它无法访问您现有的图像。但是,它的 源代码 对于 Corona Enterprise 插件开发人员来说可能很有用,它可以用作 macOS、iOS、tvOS、Android 和 Windows 上支持的跨平台 Corona 插件的模板。
示例
我们制作了一个快速演示,使用此新插件的 :setPixel() 方法创建 Spirograph™ 风格的绘图。要进行测试,您需要在 Corona 市场中激活该插件,并将该插件添加到您的 build.settings
中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
local memoryBitmap = require( "plugin.memoryBitmap" ) local tex = memoryBitmap.newTexture( { width = 1024, height = 1024, format = "rgba" }) local function makeSpirals( texture, xOffset, yOffset, innerRadius, outerRadius, penOffset, color ) -- 基于:http://introcs.cs.princeton.edu/java/15inout/Spirograph.java.html local R = outerRadius local r = innerRadius local a = penOffset for t = 0.0, 100, 0.01 do local x = (R+r) * math.cos(t) - (r+a) * math.cos(((R+r)/r)*t) local y = (R+r) * math.sin(t) - (r+a) * math.sin(((R+r)/r)*t) local degrees = -1 * math.deg((R+r)/r)*t texture:setPixel( x + xOffset, y + yOffset, color ) end texture:invalidate() end makeSpirals( tex, 512, 512, 100, 55, 20, { 1, 0, 0, 1 } ) |
在此示例中,memoryBitmap.newTexture() 函数返回一个空白的画布供您使用。本质上,您需要告知它对象的大小和颜色深度规则,然后就可以开始随意地操作像素。
结论
我们很高兴看到有进取心的 Corona 开发人员将使用 TextureResourceExternal 和 memoryBitmap 插件作为基础,来创造出惊人的功能。有什么好主意吗?请在 Corona 论坛 中加入我们吧!
抱歉,评论表单目前已关闭。