OpenGL ES 框架詳細(xì)解析(十四) —— 使用紋理工具壓縮紋理

版本記錄

版本號 時間
V1.0 2017.10.05

前言

OpenGL ES是一個強(qiáng)大的圖形庫圾另,是跨平臺的圖形API蘸吓,屬于OpenGL的一個簡化版本车海。iOS系統(tǒng)可以利用OpenGL ES將圖像數(shù)據(jù)直接送入到GPU進(jìn)行渲染枢舶,這樣避免了從CPU進(jìn)行計算再送到顯卡渲染帶來的性能的高消耗赶么,能帶來來更好的視頻效果和用戶體驗肩豁。接下來幾篇就介紹下iOS 系統(tǒng)的 OpenGL ES框架。感興趣的可以看上面幾篇。
1. OpenGL ES 框架詳細(xì)解析(一) —— 基本概覽
2. OpenGL ES 框架詳細(xì)解析(二) —— 關(guān)于OpenGL ES
3. OpenGL ES 框架詳細(xì)解析(三) —— 構(gòu)建用于iOS的OpenGL ES應(yīng)用程序的清單
4. OpenGL ES 框架詳細(xì)解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架詳細(xì)解析(五) —— 使用OpenGL ES和GLKit進(jìn)行繪制
6. OpenGL ES 框架詳細(xì)解析(六) —— 繪制到其他渲染目的地
7. OpenGL ES 框架詳細(xì)解析(七) —— 多任務(wù)清钥,高分辨率和其他iOS功能
8. OpenGL ES 框架詳細(xì)解析(八) —— OpenGL ES 設(shè)計指南
9. OpenGL ES 框架詳細(xì)解析(九) —— 調(diào)整您的OpenGL ES應(yīng)用程序
10. OpenGL ES 框架詳細(xì)解析(十) —— 使用頂點(diǎn)數(shù)據(jù)的最佳做法
11. OpenGL ES 框架詳細(xì)解析(十一) —— 并發(fā)和OpenGL ES
12. OpenGL ES 框架詳細(xì)解析(十二) —— 采用OpenGL ES 3.0
13. OpenGL ES 框架詳細(xì)解析(十三) —— Xcode OpenGL ES工具概述

Using texturetool to Compress Textures - 使用紋理工具壓縮紋理

iOS SDK包括一個將紋理壓縮為PVRTC或ASTC格式的工具琼锋,恰當(dāng)?shù)孛麨?code>texturetool。 如果您安裝了iOS 7.0 SDK或更高版本的Xcode祟昭,那么texturetool位于:/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/texturetool缕坎。

紋理工具提供了各種壓縮選項,在圖像質(zhì)量和尺寸之間進(jìn)行權(quán)衡从橘。 您需要對每個紋理進(jìn)行實驗念赶,以確定哪個設(shè)置提供最佳折中。

注意:紋理工具可用的編碼器恰力,格式和選項可能會更改叉谜。 本文檔介紹了從iOS 7開始可用的選項。


texturetool Parameters - texturetool參數(shù)

可以傳遞給紋理工具的參數(shù)在本節(jié)的其余部分進(jìn)行了描述踩萎。

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如果不提供其他選項的話香府,默認(rèn)為--bits-per-pixel-4, --channel-weighting-linear-f Raw董栽。

--bits-per-pixel-2--bits-per-pixel-4選項創(chuàng)建PVRTC數(shù)據(jù),將源像素編碼為每像素2或4位企孩。 與未壓縮的32位RGBA圖像數(shù)據(jù)相比锭碳,這些選項代表固定的16:1和8:1壓縮率。 最小數(shù)據(jù)大小為32字節(jié); 壓縮器從不產(chǎn)生比此更小的文件勿璃,并且至少在上傳壓縮紋理數(shù)據(jù)時預(yù)計會有許多字節(jié)擒抛。

當(dāng)壓縮時,指定 --channel-weighting-linear所有通道的平均壓縮誤差补疑。 相反歧沪,與線性選項相比,指定--channel-weighting-perceptual嘗試減少綠色通道中的錯誤莲组。 一般來說诊胞,PVRTC壓縮比攝影圖像比線條藝術(shù)更好。

-m選項會自動為源圖像生成mipmap級別锹杈。 這些級別作為創(chuàng)建的存檔中的附加映像數(shù)據(jù)提供撵孤。 如果您使用原始圖像格式,則每個級別的圖像數(shù)據(jù)將一個接一個地附加到存檔竭望。 如果使用PVR歸檔格式早直,則每個mipmap圖像都將作為存檔中的單獨(dú)圖像提供。

(-f)參數(shù)控制其輸出文件的格式市框。 默認(rèn)格式為Raw霞扬。 此格式是原始壓縮紋理數(shù)據(jù),無論是單個紋理級別(不使用-m選項)還是連接在一起的每個紋理級別(使用-m選項)。 存儲在文件中的每個紋理級別的大小至少為32字節(jié)喻圃,并且必須將其全部上傳到GPU萤彩。 PVR格式與Imagination TechnologiesPowerVR SDK中找到的PVRTexTool所使用的格式相匹配。 要加載PVR壓縮紋理斧拍,請使用 GLKTextureLoader類雀扶。

-s-c選項在編碼期間打印錯誤指標(biāo)。 -s選項將輸入(未壓縮)圖像與輸出(編碼)圖像進(jìn)行比較肆汹,-c選項可以比較任何兩個圖像愚墓。 比較結(jié)果包括均方根誤差(rms),感知加權(quán)pRms昂勉,最壞情況紋理錯誤(max)和每個統(tǒng)計量(rmsC浪册,pRmsC和maxC)的基于合成的版本。 基于合成的錯誤假定圖像的Alpha通道用于不透明度岗照,并且每個紋素的顏色與最壞情況的目標(biāo)顏色混合村象。

在優(yōu)化壓縮圖像時,與-s-c選項以及編碼器一起使用的錯誤指標(biāo)默認(rèn)情況下將圖像的Alpha通道視為獨(dú)立通道(或使用--alpha-is-independent選項時)攒至。--alpha-is-opacity選項根據(jù)標(biāo)準(zhǔn)混合操作將錯誤度量值更改為一個厚者,如通過調(diào)用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)來實現(xiàn)的迫吐。

PVR紋理壓縮支持特殊的穿透模式库菲,可以在每個4x4塊的基礎(chǔ)上啟用。 該模式限制了塊內(nèi)可以使用的顏色漸變志膀,但是引入了將像素的Alpha值強(qiáng)制為0的選項蝙昙。它可以打敗PVRTC平滑色彩插值,引入塊邊界偽像梧却,因此應(yīng)謹(jǐn)慎使用。 三個突破性選項是:

  • --punchthrough-unused败去。沒有穿透(默認(rèn)選項)放航。
  • --punchthrough-allowed。當(dāng)優(yōu)化圖像質(zhì)量時圆裕,編碼器可以逐塊地實現(xiàn)穿透广鳍。 該選項通常改進(jìn)了壓縮算法使用的目標(biāo)(每像素)誤差度量,但可能會引入主觀的偽像吓妆。
  • --punchthrough-forced赊时。 每個塊都啟用Punchthrough,限制顏色漸變行拢,但是可以讓塊中的任何像素的alpha為0祖秒。此選項主要用于完整性,但是當(dāng)結(jié)果在視覺上與其他選項進(jìn)行比較時還是有用的。

重要信息:編碼器的源圖像必須滿足以下要求:

  • 高度和寬度必須至少為8竭缝。
  • 高度和寬度必須是2的冪房维。
  • 必須是正方形(height == width)
  • 源圖像必須采用Image IO在OS X中接受的格式抬纸。為獲得最佳效果咙俩,原始紋理應(yīng)以未壓縮的數(shù)據(jù)格式開始。

重要提示:如果您使用PVRTexTool來壓縮紋理湿故,那么您必須創(chuàng)建張方形的并且是2的次冪長度的紋理阿趁。 如果您的應(yīng)用程序嘗試在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

注意:無需創(chuàng)建預(yù)覽也不能指定-o參數(shù)和有效的輸出文件脖阵。 預(yù)覽圖像始終為PNG格式。

要加載PVR壓縮紋理砚哆,請使用GLKTextureLoader類独撇。

有關(guān)直接使用PVR壓縮數(shù)據(jù)的示例,請參閱PVRTextureLoader 示例躁锁。

后記

未完纷铣,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市战转,隨后出現(xiàn)的幾起案子搜立,更是在濱河造成了極大的恐慌,老刑警劉巖槐秧,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啄踊,死亡現(xiàn)場離奇詭異,居然都是意外死亡刁标,警方通過查閱死者的電腦和手機(jī)颠通,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀懈,“玉大人顿锰,你說我怎么就攤上這事∑袈В” “怎么了硼控?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胳赌。 經(jīng)常有香客問我牢撼,道長,這世上最難降的妖魔是什么疑苫? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任熏版,我火速辦了婚禮纷责,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纳决。我一直安慰自己碰逸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布阔加。 她就那樣靜靜地躺著饵史,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胜榔。 梳的紋絲不亂的頭發(fā)上胳喷,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音夭织,去河邊找鬼吭露。 笑死,一個胖子當(dāng)著我的面吹牛尊惰,可吹牛的內(nèi)容都是我干的讲竿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼弄屡,長吁一口氣:“原來是場噩夢啊……” “哼题禀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膀捷,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤迈嘹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后全庸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秀仲,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年壶笼,在試婚紗的時候發(fā)現(xiàn)自己被綠了神僵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡覆劈,死狀恐怖保礼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墩崩,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布侯勉,位于F島的核電站鹦筹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏址貌。R本人自食惡果不足惜铐拐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一徘键、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遍蟋,春花似錦吹害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棒厘,卻和暖如春纵穿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奢人。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工谓媒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人何乎。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓句惯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親支救。 傳聞我的和親對象是個殘疾皇子抢野,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容