OpenGL ES 框架详细解析(十四) —— 使用纹理工具压缩纹理

版本记录

版本号 时间
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 TechnologiesPowerVR 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 示例。

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容