使用nvtt轉換DDS格式圖片

參考:https://github.com/castano/nvidia-texture-tools
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

nvtt: nvidia texture tools

nvtt是一個用c++寫的庫,可以用來做dds格式的轉換,比較適用與在C++代碼中集成dds轉換時使用。

在window下使用的它,所以涉及到windows下的編譯和對它使用。簡單記錄對它的使用過程如下。

編譯nvtt庫

從github上把源代碼下載下來:
https://github.com/castano/nvidia-texture-tools
使用vs打開project/vc12/nvtt.sln,然後編譯出nvtt庫和常用的幾個轉換用的命令行程序。

Open project/vc12/thekla.sln using Visual Studio.
Solutions for previous versions are also available, but they may not be up to date.

使用nvtt庫

把src/nvtt/nvtt.h文件複製到工程目錄中使用即可,並把依賴庫nvtt.lib配置到工程中。
src/nvtt/tools/compress.cpp是一個使用的樣例,可以供參考。

To use the NVIDIA Texture Tools in your own applications you just have to include the following header file:
src/nvtt/nvtt.h
And include the nvtt library in your projects.
The following file contains a simple example that shows how to use the library:
src/nvtt/tools/compress.cpp

使用的一些經驗

Surface

  1. Surface數據結構
    Surface存儲的數據結構爲,rgba4個channel塊,數據存儲分塊,第一塊是r,第二塊是g,第三塊是b,第四塊是a, 數據都是float類型的。
    使用Surface.data()時,注意它的顏色數據格式是rrrrr-gggg-bbbb-aaaa這種格式,而不是通常的rgba-rgba-…這種格式。可以通過Surface.channel(0-3)分別取出r/g/b/a這四塊的顏色數據指針。

  2. Surface.setImage2D解析dds-mip-data
    Surface.setImage2D可以支持把dds格式的data數據的解析。通過Format和參數Decoder,確定了dds數據解析方式,把dds的4*4格式解析爲rgba的4個channel上。
    Decoder支持3種:Decoder_D3D10,Decoder_D3D9, Decoder_NV5x

  3. Surface.resize縮放圖片
    resize方法可以對Surface存儲的顏色channel數據進行縮放,並且支持幾種縮放時指定的ResizeFilter和RoundMode,ResizeFilter例如常用的ResizeFilter_Box,ResizeFilter_Kaiser。

inputOptions

  1. InputOptions的作用
    a. 包括指定輸入的圖片資源信息: 包括顏色格式,顏色數據
    b. 指定生成mipmap時的參數,如MipmapFilter,RoundMode等。

  2. InputOptions.setFormat
    輸入顏色信息的格式被限定在InputFormat格式類型上,這個格式有四種類型:
    enum InputFormat
    {
    InputFormat_BGRA_8UB, // Normalized [0, 1] 8 bit fixed point.
    InputFormat_RGBA_16F, // 16 bit floating point.
    InputFormat_RGBA_32F, // 32 bit floating point.
    InputFormat_R_32F, // Single channel 32 bit floating point.
    };
    這個很關鍵,它限定了輸入顏色信息需要遵循的格式,例如:
    InputFormat_RGBA_32F, 它要求的輸入顏色信息是這樣子的: rgba-rgba-…,並且r|g|b|a都爲float型。

  3. 使用Surface中數據作爲
    Surface的數據源是rrrr-gggg-bbbb-aaaa的float格式,在InputOptions支持的格式種類中,InputFormat_RGBA_32F比較匹配,另外需要把數據源調整爲rgba-rgba-rgba-rgba這種格式, 借用surface.channel(0-3)取出各個通道的值重新組裝成該格式。

CompressionOptions

  1. CompressionOptions作用
    a. 指定輸出格式,例如輸出格式使用Format_DXT5
    b. 指定壓縮質量,例如Quality_Fastest或Quality_Production

  2. setFormat
    輸出格式支持的比較多,像常用的dxt1-dxt3-dxt5等,像基本的RGB和RGBA格式等,還有較新的類似PVR_2BPP_RGB等。

  3. 補充一點
    補充一個點,建議壓縮時使用Compressor.process方法來進行,這個相對來說驗證的更充分一些。

其它例如OutputOptions和Compressor等就不一一說明了,這些使用積累的經驗教訓不多,可以參考例子來參考使用,也可以參考nvtt的參考文檔來使用。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

發佈了258 篇原創文章 · 獲贊 87 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章