65.9K
CodeProject 正在变化。 阅读更多。
Home

纹理图集制作器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (15投票s)

2012年2月15日

BSD

6分钟阅读

viewsIcon

153056

downloadIcon

7239

用于创建 2D OpenGL 游戏纹理图集的实用程序。

引言

我决定开源我们内部的纹理图集创建工具,因为我认为这对其他独立游戏开发者会有用。

特点

  • 为速度而建
加载纹理的速度几乎是加载 PNG 的 5 倍
  • 一键操作
简化了艺术管线。一键创建具有多种格式的多个图集。
  • 开源
提供 Java 源代码,您可以根据自己的需求修改该工具。

什么是纹理图集?

纹理图集将多个图像打包到一个纹理中。在某些平台 OpenGL 纹理必须是 2 的幂次方大小,单独加载图像将需要大量的填充,这意味着浪费 GPU 内存。而且,将所有图像放在一个纹理中可以实现绘制调用批处理:换句话说,可以一次调用绘制多个精灵。

这是为谁准备的?

虽然该工具是为 iPhone 开发的,但它对包括 Android 和 PC 在内的大多数平台都有用。该工具是用 Java 编写的,可在 Windows、Mac 和 Linux 上运行。

包含一个示例 iPhone 项目,演示了如何加载纹理图集。代码是 C++ 编写的,旨在具有可移植性。

如何使用

下载文件 AtlasMaker_jar_2.2.1.zip 并解压缩。您需要安装 Java 才能使用它。如果想创建 PVR 压缩纹理,还可能需要安装 Imagination Technologies 的 PVRTexTool

330742/settings4.png

  • 输入文件夹

项目的源图像必须是 PNG 格式,并且必须按照文件格式进行目录组织。选择输入文件夹的位置,然后将显示目录结构。然后为每个目录选择所需的文件格式。

  • Targa 真彩色
这是默认选项。选择此项以获得最佳质量。注意:targa 文件以 OpenGL 顺序存储 RGB 字节,因此加载速度更快。这意味着如果您在 PC 上打开该文件,它看起来会很奇怪,但在设备上看起来会正常。该文件是 32 位,如果没有 alpha 通道,则是 24 位。
  • 16 位 Targa
选择此选项每像素仅使用 16 位,但会减少颜色数量。颜色变化细微的纹理(即渐变)看起来会很差。
  • PVR
压缩 PVR 格式。每像素使用 2 位或 4 位。此格式更适合没有透明边框的“有机”图像。注意:每个图像周围会创建 2 像素的填充。这是为了防止相邻图像的像素出现(PVR 算法会在图像边框外绘制像素)。
  • 输出文件

选择输出文件的名称和位置。纹理图集将保存到同一目录。

高级选项

单击“选项...”按钮打开高级选项。

  • 最大尺寸
这是您目标设备的纹理的最大尺寸(宽度和高度)。
  • 2 的幂次方 / 非 2 的幂次方
2 的幂次方将尺寸限制为 2 的幂次方(例如,32x32、64x32 等)。非 2 的幂次方意味着没有任何限制。
  • Alpha 阈值
透明像素会从所有源图像中修剪掉。Alpha 阈值表示什么被认为是透明的。
  • PVRTexTool 的位置
这是您安装命令行 PVRTexTool 的文件位置。
  • PVR 选项
当选择 PVR 文件格式时,首先会将纹理图集创建为 PNG,然后调用 PVRTexTool 将其转换为 PVR。这是一个缓慢的操作,所以默认情况下“转换 PVR”未选中。
选择 2 位以减少内存使用,但质量较低,或选择 4 位以获得更高的质量。
  • XML 格式
选择默认的 XML 格式,或 Cocos2D plist 格式。

输出标签页

为每个纹理创建一个标签页。标签图标包含纹理的预览。为了方便起见,单击纹理中的任何位置都会显示单击图像的文件名。

创建的纹理

该应用程序尝试将图像尽可能地装入最小的纹理尺寸。对于 2 的幂次方纹理,它首先尝试装入 32x32,然后是 32x64,然后是 64x64,然后是 128x64……依此类推,直到达到最大尺寸。对于非 2 的幂次方,它会自动选择最小的任意尺寸。如果图像无法装入最大尺寸的纹理,则会创建额外的纹理,直到所有图像都装入为止。

如果您选择 PVR 格式,纹理将是正方形且为 2 的幂次方。

每个文件将以目录和索引号命名。例如,如果图像在“images”目录中,则可能创建以下纹理:images0.tga、images1.tga、images2.tga 等。

输出 XML 文件

该应用程序创建一个 XML 文件,其中包含每个纹理图集中每个图像的所有数据,例如:

<atlas numImages="4">
  <texture file="testImages0.pvr" trans="true">
    <image name="arch" x="0" y="0" width="89" height="71"/>
    <image name="prowlerBody0_1" x="36" y="342" width="43" height="34" yOffset="5" transWidth="46" transHeight="39"/>
  </texture>
  <texture file="dump0.pvr" trans="true">
    <image name="arrowDownPressed" x="400" y="54" width="46" height="39"/>
    <image name="arrowUpPressed" x="448" y="54" width="46" height="37"/>
  </texture>
</atlas>

首先,“atlas”元素会告诉您图集中的总图像数量,以便在加载时可以预分配内存。

然后每个纹理元素都有文件名、透明度和图像元素列表。

每个图像元素包含以下数据:

  • x, y, 宽度, 高度
  • 图像在纹理中的位置和大小。

  • xOffset, yOffset, transWidth, transHeight
  • 用于精灵动画的填充数据。如果我们有精灵动画,每个精灵都需要填充,以便图像在动画过程中不会“跳动”,但我们不想在纹理中存储空白区域而浪费内存。

    330742/xOffset.png

为什么 PNG 不适合游戏

PNG 是一种复杂的格式,解码速度慢。以下是一些基准测试,显示了 PNG 的速度有多慢。

PNGTarga 32 位*Targa 16 位
在 Windows 上加载 (libpng)64 毫秒9 毫秒5 毫秒
在 iPhone 3GS 上加载*385 毫秒83 毫秒
大小1.27 MB2.42 MB1.23 MB
压缩后大小1.26 MB1.25 MB339 kB
加载 1024 x 1024 纹理(带透明度的复杂图像)

如您所见,在 iPhone 上纹理加载速度比 32 位 Targa 慢 4.6 倍。尽管 Targa 文件大一倍,但在压缩后大小相同,因此打包尺寸也相同。此外,如果您的图像只需要 16 位质量,您将获得双重节省。PNG 没有 16 位选项。

正如您所见,使用 Targa 是不二之选。

  • 注释

在 iPhone 上使用原生 iOS API (即 UIImage) 解码 PNG。Targa 是 RLE 压缩的 Targa。

加载 Targa

有关 Targa 文件如何加载的详细信息,请参阅 ImageTargaTargaReader 类。

16 位 Targa 存储为 GL_UNSIGNED_SHORT_4_4_4_4。但是,如果纹理图集完全不透明,则不保存 alpha 通道,像素存储为 GL_UNSIGNED_SHORT_5_6_5

如果选择了“Targa 真彩色”,则根据是否有 alpha 透明度,保存为 32 位或 24 位。

演示 iPhone 项目

随附一个 Xcode 项目,该项目打开生成的纹理并显示一个精灵。大部分代码是 C++ 编写的,以实现可移植性。

项目中使用的类如下:

  • 游戏
主游戏对象。
  • ResManager
设置 OpenGL 状态并初始化所有资源
  • AtlasMaster
读取图集 XML 文件并创建 AtlasImage 对象和纹理,并将它们存储在映射中以供检索。
  • XParser
快速 XML 解析器,功能已精简。使用仅前进方式进行解析,以避免创建 DOM 的开销。
  • TargaReader
读取 32 位和 16 位 Targa 文件
  • CommonBuffer
所有纹理文件都加载到一个共享缓冲区中,而不是每次都创建和删除。
  • ImagePVR
加载 PVR 纹理。
  • AtlasImage
为每个图像创建一个纹理四边形。
注意:项目使用了 boost/unordered_map.hpp。您需要下载 boost 并将项目包含头文件在 Xcode 中指向您安装 boost 的位置。或者,您可以将行:#define fmap boost::unordered_map 更改为 precompile.h 中的 #define fmap std::map

历史

版本 2.0

  • 添加了非 2 的幂次方功能
  • 允许用户指定最大纹理尺寸
  • 改进了图集创建算法
  • 使代码更加健壮

版本 2.1

  • 如果纹理中没有透明度,则不保存 alpha 通道
  • 修复了错误:Mac 版本无法正确读取 PVRTexTool 可执行文件

 版本 2.2.1

  • 添加了对 Cocos2D 的支持(感谢 Starfair :) )
  • 算法的少量改进


© . All rights reserved.