Using texturetool to Compress Textures - 使用纹理工具压缩纹理
iOS SDK包括一个将纹理压缩为PVRTC或ASTC格式的工具,恰当地命名为texturetool。 如果您安装了iOS 7.0 SDK或更高版本的Xcode,那么texturetool位于:/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool。
纹理工具提供了各种压缩选项,在图像质量和尺寸之间进行权衡。 您需要对每个纹理进行实验,以确定哪个设置提供最佳折中。
注意:纹理工具可用的编码器,格式和选项可能会更改。 本文档介绍了从iOS 7开始可用的选项。
texturetool Parameters - texturetool参数
可以传递给纹理工具的参数在本节的其余部分进行了描述。
user$ texturetool -h Usage: texturetool [-hl] texturetool -ctexturetool [-ms] [-e] [-p] -o[-f]first form: -h Display this help menu. -l List available encoders, individual encoder options, and file formats. second form: -c Comparetoand report differences. third form: -m Generate a complete mipmap chain from the input image. -s Report numerical differences betweenand the encoded image. -eEncode texture levels with. -pOutput a PNG preview of the encoded output to. Requires -e option -oWrite processed image to. -fSet fileforimage.
注意:-p选项表示需要-e选项。 它还需要-o选项。
// Listing C-1Encoding optionsuser$ texturetool -lEncoders: PVRTC --channel-weighting-linear --channel-weighting-perceptual --bits-per-pixel-2--bits-per-pixel-4--alpha-is-independent --alpha-is-opacity --punchthrough-unused --punchthrough-allowed --punchthrough-forcedASTC --block-width-4--block-width-5--block-width-6--block-width-8--block-width-10--block-width-12--compression-mode-veryfast --compression-mode-fast --compression-mode-medium --compression-mode-thorough --compression-mode-exhaustive --srgb-yes --srgb-no --block-height-4--block-height-5--block-height-6--block-height-8--block-height-10--block-height-12Formats: RawPVRKTX
texturetool如果不提供其他选项的话,默认为--bits-per-pixel-4, --channel-weighting-linear和-f Raw。
--bits-per-pixel-2和--bits-per-pixel-4选项创建PVRTC数据,将源像素编码为每像素2或4位。 与未压缩的32位RGBA图像数据相比,这些选项代表固定的16:1和8:1压缩率。 最小数据大小为32字节; 压缩器从不产生比此更小的文件,并且至少在上传压缩纹理数据时预计会有许多字节。
当压缩时,指定--channel-weighting-linear所有通道的平均压缩误差。 相反,与线性选项相比,指定--channel-weighting-perceptual尝试减少绿色通道中的错误。 一般来说,PVRTC压缩比摄影图像比线条艺术更好。
-m选项会自动为源图像生成mipmap级别。 这些级别作为创建的存档中的附加映像数据提供。 如果您使用原始图像格式,则每个级别的图像数据将一个接一个地附加到存档。 如果使用PVR归档格式,则每个mipmap图像都将作为存档中的单独图像提供。
(-f)参数控制其输出文件的格式。 默认格式为Raw。 此格式是原始压缩纹理数据,无论是单个纹理级别(不使用-m选项)还是连接在一起的每个纹理级别(使用-m选项)。 存储在文件中的每个纹理级别的大小至少为32字节,并且必须将其全部上传到GPU。 PVR格式与Imagination Technologies的PowerVR SDK中找到的PVRTexTool所使用的格式相匹配。 要加载PVR压缩纹理,请使用GLKTextureLoader类。
-s和-c选项在编码期间打印错误指标。 -s选项将输入(未压缩)图像与输出(编码)图像进行比较,-c选项可以比较任何两个图像。 比较结果包括均方根误差(rms),感知加权pRms,最坏情况纹理错误(max)和每个统计量(rmsC,pRmsC和maxC)的基于合成的版本。 基于合成的错误假定图像的Alpha通道用于不透明度,并且每个纹素的颜色与最坏情况的目标颜色混合。
在优化压缩图像时,与-s和-c选项以及编码器一起使用的错误指标默认情况下将图像的Alpha通道视为独立通道(或使用--alpha-is-independent选项时)。--alpha-is-opacity选项根据标准混合操作将错误度量值更改为一个,如通过调用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)来实现的。
PVR纹理压缩支持特殊的穿透模式,可以在每个4x4块的基础上启用。 该模式限制了块内可以使用的颜色渐变,但是引入了将像素的Alpha值强制为0的选项。它可以打败PVRTC平滑色彩插值,引入块边界伪像,因此应谨慎使用。 三个突破性选项是:
--punchthrough-unused。没有穿透(默认选项)。
--punchthrough-allowed。当优化图像质量时,编码器可以逐块地实现穿透。 该选项通常改进了压缩算法使用的目标(每像素)误差度量,但可能会引入主观的伪像。
--punchthrough-forced。 每个块都启用Punchthrough,限制颜色渐变,但是可以让块中的任何像素的alpha为0。此选项主要用于完整性,但是当结果在视觉上与其他选项进行比较时还是有用的。
重要信息:编码器的源图像必须满足以下要求:
高度和宽度必须至少为8。
高度和宽度必须是2的幂。
必须是正方形(height == width)。
源图像必须采用Image IO在OS X中接受的格式。为获得最佳效果,原始纹理应以未压缩的数据格式开始。
重要提示:如果您使用PVRTexTool来压缩纹理,那么您必须创建张方形的并且是2的次幂长度的纹理。 如果您的应用程序尝试在iOS中加载非平方或非2的次幂长度的纹理,则会返回错误。
// Listing C-2 Encoding images into the PVRTC compression formatEncode Image.png into PVRTCusinglinear weightsand4bpp,andsaving as ImageL4.pvrtcuser$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4-o ImageL4.pvrtc Image.pngEncode Image.png into PVRTCusingperceptual weightsand4bpp,andsaving as ImageP4.pvrtcuser$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4-o ImageP4.pvrtc Image.pngEncode Image.png into PVRTCusinglinear weightsand2bpp,andsaving as ImageL2.pvrtcuser$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2-o ImageL2.pvrtc Image.pngEncode Image.png into PVRTCusingperceptual weightsand2bpp,andsaving as ImageP2.pvrtcuser$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2-o ImageP2.pvrtc Image.png
// Listing C-3 Encoding images into the PVRTC compression format while creating a previewEncode Image.png into PVRTC using linear weightsand4bpp,andsaving the outputasImageL4.pvrtcanda PNG previewasImageL4.pnguser$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4-o ImageL4.pvrtc -p ImageL4.png Image.pngEncode Image.png into PVRTC using perceptual weightsand4bpp,andsaving the outputasImageP4.pvrtcanda PNG previewasImageP4.pnguser$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4-o ImageP4.pvrtc -p ImageP4.png Image.pngEncode Image.png into PVRTC using linear weightsand2bpp,andsaving the outputasImageL2.pvrtcanda PNG previewasImageL2.pnguser$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2-o ImageL2.pvrtc -p ImageL2.png Image.pngEncode Image.png into PVRTC using perceptual weightsand2bpp,andsaving the outputasImageP2.pvrtcanda PNG previewasImageP2.pnguser$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2-o ImageP2.pvrtc -p ImageP2.png Image.png
注意:无需创建预览也不能指定-o参数和有效的输出文件。 预览图像始终为PNG格式。
要加载PVR压缩纹理,请使用GLKTextureLoader类。
有关直接使用PVR压缩数据的示例,请参阅PVRTextureLoader示例。