libgdx:[31]创建纹理图集
在游戏中要用到很多的图片,把他们通过处理放到一张纹理图集中,将会非常节约资源。
工具/原料
libgdx
eclipse
Creating texture atlases 创建纹理图集
1、在我们开始创建一个纹理地图集之前,让我们首先了解一下这项技术到底好在哪里一个纹理地兔脒巛钒图集只是一个普通的图片就像其他任何可以被绘制在屏幕上的图片一样。那么是什么让他那么特别?它被当做一个图片的容儡泌掩羞器来用,它包括很多的子图片,这些图片相互不重叠,充满整个纹理图集。这样一来,我们就可以大大减少发送给graphicsproessor(绘制进程) 的texture的数量。这样可以显著提高所有的render的性能。纹理图集对于那些一次性绘制很多小的不同图片是很有用的。因为切换不同的纹理是一个非常昂贵的过程。每一次绘制时你改变textures,新的数据需要被发送到图像存储器。如果你使用的是同一个texture这将被避免。
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/5c2a1ad149299a885cd7da5667eeadbcbf2f7f1b.jpg)
2、纹理图集不仅显著的增加我们游戏的帧频,还允许我们使用非二次幂的纹理图片。然而,纹理图集的尺寸应该是二的次幂限制的图片,预防那些不支持非二的次幂图片的硬件设备遇到问题。次级图片支持任意尺寸的原因是poweroftwo纹理限制规则只限于加载到图像处理器的纹理图片。因此,当我们真正的渲染一个子图像时,我们仍然使用2幂纹理,这是2的幂纹理我们的像素源;然而,我们只会使用它的某一部分作为我们的最终纹理绘制其他东西。
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/05aae8a75f0f822be32a2e81c018512c8df14d1b.jpg)
3、看一下这个截屏图片,它显示的 是我们把所有游戏中用的图片放到一个文件中得到的结果
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/7a3e980e7c75e5f45a31dcbeb1ceaad7736bbc1b.jpg)
4、Libgdx含有一个内置的纹理打包器,会自动打包纹理图片到一个纹理中,我们只需要把前面项目中的对象图片放到一个纹理集中得到如下结果。
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/65390a23beb9763e930689656ad06de89b61b01b.jpg)
5、图片已经被整齐的没有任何重叠的放到一个文集图集中了。紫色边框是libgdx的纹理打包工具的调试特性,可以被打开和关闭。这个可以被看做是次级图片的真实尺寸,否是如果你的纹理图片是透明的尺寸将很难被分辨。我们上面的云和山的图片,就是一个很好的例子。通常当padding被设置为可用时,默认会在每个边上有两个空的像素,你可以看到调试用的紫色的线不可用时的区别.
6、把你的图片填充到一个纹理图集中有助于你在texture过滤或mip-maping可用时避免一个问题:texturebleeding或者叫做pixelsbleeding.(两个纯色的图片放到一起时,在他们的边缘会出现两种颜色的混合交叉)Texture过滤模块可以被设置为使纹理的边缘平滑,这个是通过查找边缘的像素信息实现的,如果一个子图的旁边有另外一个子图这就会造成不希望的结果,旁边的子图的像素信息会被计算到另外的子图中去。
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/b1454a1bd10ff226b35e03bd9c99e92abbb8a41b.jpg)
7、想要打包texture,有一些准备工作要提前做,因为打包纹理的工具并不是libgdx的核心功能,他是一个外部功能。到libgdx根目录下找到extractextensions/libgdx-tools.jar把这个文件放到libgdx桌面项目的lib目录下。然后右键单击它buildpatch。……
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/c255efc595ee41c17ee39ee08d88912ca4ca9b1b.jpg)
8、这样我们就可以实现纹理图集的自动生成啦。创建一个叫做asser-raw的文件到canyonBunny桌面项目下。同样的,添加一个子文件命名为assets-raw/images.这个是我们要放进纹理图集的图片的存放位置。
9、下一步添加下面两行代码导入TexturePacker2和他的设置类:importcom.badlogic.gdx.tools.imagepacker.TexturePacker2;importcom.badlogic.gdx.tools.imagepacker.TexturePacker2.Settings;
10、然后桌面项目实现下面的更改:。。。 。。。
11、添加的代码提供了一个每次运行桌面项目,很方便的创建texture图集的功能。TherebuildAtlas的值控制着启动的时候是否创建图集,可以被设置成true或FALSE。使用TexturePacker2类创建纹理图集是直接了当的。它包括一个静态的方法:process()可选的生成纹理图集的方式,三个必选的参数。第一个必选的参数是包括我们图片的资源文件。第二个是创建的图集的保存目录文件。最后第三个参数是描述性文件的文件名。
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/994f412043715fdbe0e48b89468920c5270f8c1b.jpg)
12、资源文件(在我们的示例中是,assets-raw/images)指定于桌面项目关联因此thetexturepacker代码从那里运行.蚕蝣鲢蹙目标文件(在我们的示例中,../CanyonBunny-android/assets/images)也和桌面项目关联。.尽管如此结果图集必须被放到android项目中的assets文件中,以便他能够被所有平台的软件使用,支持所有平台.描述性文件(在我们的示例中,canyonbunny.pack)将会被TexturePacker2创建它将保存着所有的子图片的相关信息,比如在图集中的位置大小开端
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/89402670d5413a8c45cc97bc1ffc508c9ace811b.jpg)
13、Settings的maxWidth和maxHeight属性规定图集的最大烹挹戢愠尺寸。确保某一个子图集没有在宽度或高度上超出最大尺寸。把子图片填充到一个图集中会使他的可用尺寸稍微变大一点,所以要把这个计算在内。调试变量将决定调试框线条是否被添加到图集中。我们用drawdebugoutline变量来设置debugging的值。静态变量:rebuildAtlas和drawDebugOutline让我们可以方便地让这两个特性更加突出,我们调试游戏时会经常改变这两个属性.
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/890dfb4a2f27e7efc7c259b219dd3340b7f3f51b.jpg)
14、现在你已经知道怎么在代码中创建一个纹理图集。这个方法通常可以很好的完成工作,但是对于当某些设置或者其中一个图片发生变化时,直接看到他输出结果的影响来说这不是很友好。幸运的已经有一个很棒的工具 叫做:TexturePacker-GUI是由Aurélien Ribon.开发的.这个工具可以直接的设计packer在libgdx中的工作状态,并适时的观察输出结果.
15、C可以到官方站点查看ttps://code.google.com/p/libgdx-texturepacker-gui/.截图显示的是这个工具的工作状态:
![libgdx:[31]创建纹理图集](https://exp-picture.cdn.bcebos.com/aebdff86242fa8726fdb8c57bfdaf05e4b23e91b.jpg)
16、还有一个比较流行的商业的纹理图打包工具叫做:TexturePacker由Andreas Löw开发,支持大多数主流平台,其网站:ttp://www.codeandweb.com/texturepacker.