纹理打包

Spine 可以将用户的个人图片打包成纹理图集或网格(spritesheet),以便运行时高效渲染。 Spine 的纹理打包器是一个通用工具,可用于 Spine 骨架,也可独立运行打包应用的全部图片。

在大部分图形 API (如 OpenGL ) 中,用户需要绑定一个纹理来执行部分绘制任务,然后再绑定另一个纹理来执行更多绘制任务……而绑定纹理相对较费事,所以最理想的办法是将许多小图片储存到一张大图片,一次性绑定大纹理,然后分部分多次绘制。 Spine 可以高效地将许多小图片打包到大图片上。小图片坐标储存在一份简单数据文件中,所以可以在应用中根据名称加以引用。

Spine 使用了多种高级打包算法。先用若干不同尺寸的探试法进行打包,然后选择最具效率的结果。

打包

纹理打包器有两种运行方法:

1) 导出 JSON 或二进制时,勾选 创建图集 :

这种方法可以方便地同时导出数据和图集,不过只打包各个骨架引用的图片,而会忽略文件夹结构以及 JSON 文件。要将多个骨架的图片打包进单个图集,可使用下一种运行打包器的方法。

2) 从主菜单选择 纹理打包器 :

然后指定用于打包的图片路径:

设置

用户可使用多种设置来控制图片打包方式:

这种方法一开始可能令人望而生畏,不过默认设置即可适用于大多数情况。最重要的设置包括:1) 最大宽度/高度, 2) 是否使用预乘 alpha ,以及 3) 是否执行去除空白。 若使用网格,则必须禁用去除空白。

区域

设置描述
去除 X/Y 轴空白区删除输入图片边缘周围的空白像素。删除数量保存在图集数据中,用户可在应用中绘制图片,效果与未去除空白区时相同。 使用网格时,必须禁用去除空白区功能。
旋转用户可90度旋转图片以提高打包效果。相关应用必须特别仔细地绘制这些区域。
别名像素完全相同的图片将只打包一次。
忽略空白图片只有透明像素的图片将不会被打包。
Alpha 阈值去除空白区时,低于该数值的 Alpha 值将被视为0。

区域填充

设置描述
填充 X/Y 打包图片之间的像素数量。一些纹理过滤步骤会对相邻像素进行平均,所以建议填充2倍,以免相邻区域互相影响。
边缘填充填充功能也将应用于页面图片边缘。
复制填充填充将从最近区域复制像素,这样可以在纹理过滤步骤选择填充像素时隐藏“接缝”伪像。

页面

设置描述
最小宽度/高度任何页面图片的最小尺寸。
最大宽度/高度任何页面图片的最大尺寸。如果图片不适合该尺寸页面,则将输出多个页面图片。
2的幂数将输出页面的长宽尺寸设为2的幂数,一些游戏工具包需要。
正方形设置宽度和高度。一些纹理压缩算法需要(如 PVRT )。

输出

设置描述
格式输出 PNG 或 JPG 页面。
JPG 品质压缩 JPG 输出。
打包

图集 尽量紧密打包图片。 网格 以统一网格(也称spritesheet)打包图片。

预乘 alpha

像素 RGB 值乘以 alpha 值。推荐在适当混合时使用。

溢出

将透明像素的 RGB 值设置成最接近非透明像素的 RGB 值。这样可以在采样透明像素 RGB 值时避免纹理过滤伪像

缩放整个图集是针对各个指定比例而输出的。
后缀每个比例图集的后缀。若后缀空白,则将输出多比例文件,而文件名与各比例子文件夹相同。

选项

设置描述
图集扩展名图集数据文件的文件扩展名。
合并子目录当前文件夹和所有子文件夹将打包到相同页面。子文件夹中的所有 JSON 设置文件均被忽略。
去除路径将子文件夹从区域文件名去除。图片文件名不得重复。
使用索引在不去除任何图片索引后缀(最后一根下划线之后的所有内容)的情况下使用图片名称。
快速打包不会很高效,但执行更快。
调试在输出页面上绘制线条以显示打包图片边界。

运行时

应用在运行时可选用这些具有提示作用的设置。

设置描述
过滤缩小/放大纹理缩小和放大设置。
包裹 X/Y 纹理包裹设置。
格式内存内格式。

文件夹结构

Spine 可一次性打包应用所需的全部图片。 Spine 会扫描文件夹的图片文件。遇到图片文件夹时, Spine 会将图片打包到一个大纹理,我们将这个纹理称为页面。如果文件夹的图片不适合单个页面的最大尺寸,则将使用多个页面。

同个文件夹中的图片会放到同一组页面。如果所有图片均适合单个页面,则不要再使用子文件夹,因为只有一个页面的话,应用就只需要执行一次纹理绑定。如果并非所有图片均适合单个页面,那么就可以使用子文件夹来分离相关图片,从而尽量减少纹理绑定次数。

比如,应用可能希望将所有“游戏”图片放到与“暂停菜单”图片不同的文件夹中,因为这两组图片会连续绘制:绘制所有游戏图片(一次绑定),然后在顶部绘制暂停菜单(另一次绑定)。如果图片在单个文件夹,则会生成多个页面,而每个页面可能同时包含游戏图片和暂停菜单图片。届时,就需要进行多次纹理绑定才能渲染游戏和暂停菜单(否则各只需一次)。

子文件夹也可有效地将图片与相关纹理设置分成一组。运行时内存格式( RGBA、RGB 等)和过滤(最近、线性等)等设置因纹理而异。因纹理设置不同而有所差异的图片需要放到不同页面,因此应该放在不同子文件夹中。

如果希望用子文件夹进行整理但又不想 Spine 针对各个子文件夹输出一组页面,请查阅 合并子目录 设置。

要避免图集文件的图片名称使用子文件夹路径,请查阅 去除路径 设置。

JSON 配置

每个文件夹可能包含一个“pack.json”文件,这个文件是用来指定该文件夹设置的。各个子文件夹将继承其父级文件夹的所有设置。子文件夹的任何设置将覆盖父级文件夹的设置。

下面是一个带有全部可用设置的 JSON 示例:

{
   pot: true,
   paddingX: 2,
   paddingY: 2,
   bleed: true,
   edgePadding: true,
   duplicatePadding: false,
   rotation: false,
   minWidth: 16,
   minHeight: 16,
   maxWidth: 1024,
   maxHeight: 1024,
   square: false,
   stripWhitespaceX: false,
   stripWhitespaceY: false,
   alphaThreshold: 0,
   filterMin: Nearest,
   filterMag: Nearest,
   wrapX: ClampToEdge,
   wrapY: ClampToEdge,
   format: RGBA8888,
   alias: true,
   outputFormat: png,
   jpegQuality: 0.9,
   ignoreBlankImages: true,
   fast: false,
   debug: false,
   combineSubdirectories: false,
   flattenPaths: false,
   premultiplyAlpha: false,
   useIndexes: true,
   grid: false,
   scale: [ 1 ],
   scaleSuffix: [ "" ]
}

请注意,这是 libgdx 的“最小” JSON 格式,所以大多数情况下双引号为选填项。

并非所有设置均需指定,可根据具体情况进行省略。比如,要关闭填充功能以及合并子文件夹,可使用下面这个 JSON:

{
   paddingX: 0,
   paddingY: 0,
   combineSubdirectories: false
}

设置对话框设有 保存 JSON 按钮,能够以当前设置保存 JSON 文件。该文件可以 pack.json 命名,放在输入图片文件夹中,并对该文件夹进行设置,而无需手动写入 JSON 。

Ninepatch

Ninepatch 通常对 Spine 骨架没有多大用处,但在其他方面可充分发挥作用。

图片文件名在文件扩展名之前以“.9”结尾的,该图片被视为 Ninepatch 。 Ninepatch 图片可以手动创建,也可使用此工具创建。图片必须有1 px 透明边界。上边和左边可以有一条黑色像素连续线,表示分割信息,也就是即将拉伸的 Ninepatch 部分。下边和右边可以有一条黑色像素连续线,表示填充信息,也就是内容嵌入 Ninepatch 顶层的方式。打包该图片时,会删除 1 px 边界,而分割信息与填充信息将会保存在图集数据文件中。

图片索引

图片索引通常对 Spine 骨架没有多大用处,但在其他方面可充分发挥作用。

图片文件名以下划线后接数字的方式结尾(如 animation_23.png )的,该数字被视为“索引”,并存储在图集数据文件的相应区域。图片名称以不带下划线和数字的方式存储。这样就可以检索相同名称的所有图片,检索结果以索引排序。该功能可方便用户打包精灵动画而不丢失帧顺序。

下一节:导入 上一节:导出