使用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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章