版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.10.05 |
前言
OpenGL ES是一个强大的图形库,是跨平台的图形API,属于OpenGL的一个简化版本。iOS系统可以利用OpenGL ES将图像数据直接送入到GPU进行渲染,这样避免了从CPU进行计算再送到显卡渲染带来的性能的高消耗,能带来来更好的视频效果和用户体验。接下来几篇就介绍下iOS 系统的 OpenGL ES框架。感兴趣的可以看上面几篇。
1. OpenGL ES 框架详细解析(一) —— 基本概览
2. OpenGL ES 框架详细解析(二) —— 关于OpenGL ES
3. OpenGL ES 框架详细解析(三) —— 构建用于iOS的OpenGL ES应用程序的清单
4. OpenGL ES 框架详细解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架详细解析(五) —— 使用OpenGL ES和GLKit进行绘制
6. OpenGL ES 框架详细解析(六) —— 绘制到其他渲染目的地
7. OpenGL ES 框架详细解析(七) —— 多任务,高分辨率和其他iOS功能
8. OpenGL ES 框架详细解析(八) —— OpenGL ES 设计指南
9. OpenGL ES 框架详细解析(九) —— 调整您的OpenGL ES应用程序
10. OpenGL ES 框架详细解析(十) —— 使用顶点数据的最佳做法
11. OpenGL ES 框架详细解析(十一) —— 并发和OpenGL ES
12. OpenGL ES 框架详细解析(十二) —— 采用OpenGL ES 3.0
13. OpenGL ES 框架详细解析(十三) —— Xcode OpenGL ES工具概述
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 -c <reference_image> <input_image>
texturetool [-ms] [-e <encoder>] [-p <preview_file>] -o <output> [-f <format>] <input_image>
first form:
-h Display this help menu.
-l List available encoders, individual encoder options, and file formats.
second form:
-c Compare <input_image> to <reference_image> and report differences.
third form:
-m Generate a complete mipmap chain from the input image.
-s Report numerical differences between <input_image> and the encoded image.
-e <encoder> Encode texture levels with <encoder>.
-p <preview_file> Output a PNG preview of the encoded output to <preview_file>. Requires -e option
-o <output> Write processed image to <output>.
-f <format> Set file <format> for <output> image.
注意:-p
选项表示需要-e
选项。 它还需要-o
选项。
// Listing C-1 Encoding options
user$ texturetool -l
Encoders:
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-forced
ASTC
--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-12
Formats:
Raw
PVR
KTX
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 format
Encode Image.png into PVRTC using linear weights and 4 bpp, and saving as ImageL4.pvrtc
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc Image.png
Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving as ImageP4.pvrtc
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc Image.png
Encode Image.png into PVRTC using linear weights and 2 bpp, and saving as ImageL2.pvrtc
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc Image.png
Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving as ImageP2.pvrtc
user$ 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 preview
Encode Image.png into PVRTC using linear weights and 4 bpp, and saving the output as ImageL4.pvrtc and a PNG preview as ImageL4.png
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc -p ImageL4.png Image.png
Encode Image.png into PVRTC using perceptual weights and 4 bpp, and saving the output as ImageP4.pvrtc and a PNG preview as ImageP4.png
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-4 -o ImageP4.pvrtc -p ImageP4.png Image.png
Encode Image.png into PVRTC using linear weights and 2 bpp, and saving the output as ImageL2.pvrtc and a PNG preview as ImageL2.png
user$ texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-2 -o ImageL2.pvrtc -p ImageL2.png Image.png
Encode Image.png into PVRTC using perceptual weights and 2 bpp, and saving the output as ImageP2.pvrtc and a PNG preview as ImageP2.png
user$ texturetool -e PVRTC --channel-weighting-perceptual --bits-per-pixel-2 -o ImageP2.pvrtc -p ImageP2.png Image.png
注意:无需创建预览也不能指定-o
参数和有效的输出文件。 预览图像始终为PNG
格式。
要加载PVR压缩纹理,请使用GLKTextureLoader类。
有关直接使用PVR压缩数据的示例,请参阅PVRTextureLoader 示例。
后记
未完,待续~~~