iOS音视频

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

2017-10-04  本文已影响0人  刀客传奇

版本记录

版本号 时间
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平滑色彩插值,引入块边界伪像,因此应谨慎使用。 三个突破性选项是:

重要信息:编码器的源图像必须满足以下要求:

重要提示:如果您使用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 示例。

后记

未完,待续~~~

上一篇 下一篇

猜你喜欢

热点阅读