这两天在写 DDS 格式的解码程序。DDS 是微软为 DirectX 开发的一种图片格式,MSDN 上可以查到其文件格式说明: http://msdn2.microsoft.com/en-us/library/bb172993.aspx

其中的 DXT 图片压缩格式,现在已经为绝大多数 3D 显卡硬件所支持。(它使用了由 S3 公司所发明的一种有损图象压缩算法。btw, 在我的那本书中,P232 有所提及)。DXT 格式 也叫作 S3TC ,现在可以被流行看图软件直接显示的图象格式中,只有 .dds 文件支持这种压缩。为了开发方便,我们的引擎也就支持了 .dds 文件的加载。一起做引擎的同事希望即使在硬件不支持的时候,我们也能正常加载并使用贴图,所以便有了对 DXT 软解码的需求。好在以前研究过一些,写起来也不麻烦。

DXT1 支持 1 bit 的 alpha 通道。这个其实是可选的。每个 4x4 的块可以根据需要有或没有这个透明通道。不需要 alpha 通道时,每个块可以有四种颜色(其中两个是插值得到的);需要 alpha 通道时,则只能有三种颜色,11 被保留用来描述透明的点。区分是否用通道,要根据每个块开始的两个高彩颜色值:color_0 和 color_1 。如果 color_0 在数值上(当作无符号短整型)大于 color_1 则没有通道。

可惜的是,在 dds 文件的文件头中,没有任何一个地方描述了:整个图片是否有至少一个块包含了 alpha 通道。但是在 3d 程序中,却需要知道这一信息以使程序可以更高效的运行。对于软解码程序,更需要知道这一信息。因为带通道时,我们需要把数据解码成 RGBA5551 的格式;而不带通道时,则需要解码成 RGB565 格式。

一开始我以为需要扫描整个数据段,检查是否至少有一个块的 color_0 小于等于 color_1 。实际看了几个用工具生成的 dds 文件才发现自己错了。nvidia 的 dxt tools 压缩 DXT1 图片时,需要手动指明是否需要 1 bit 的通道。如果你指定不带通道,那么每个 4x4 数据块头上的两个调色盘颜色值的大小次序是无关的(这样做,由于插值方案的差异,有可能得到更好一点的图象质量)。也就是说,只有压缩图片的人知道图片上是否有通道,而文件头上并无记录。

DXT3 就是在 DXT1 的基础上,增加了 4bit 的 alpha 通道,每个 4x4 块多用了 64bit 来保存这些 alpha 通道信息。(数据储存时,在每个数据块中,alpha 通道信息放在颜色信息的前面)

DXT5 对 alpha 通道的储存作了改进,有点意思,值得一提 :D 。它依旧用 64bit 储存 16 个 alpha 信息。前面 2 个字节(16bit)保存了当前块的最大 alpha 值和最小 alpha 值。接下来的 48 bit ,每个像素占用 3bit 空间,刚好描述 4x4 个像素。

当 alpha_0 大于 alpha_1 时,我们后面的 3bit 可以表示 8 级的插值;反之则保留 110 和 111 分别表示 alpha 为 0 和 255 的情况,中间可以有 6 级过度的插值。关于 DXT3 和 DXT5 的压缩算法,在 MSDN 上也可以找到详细的文章:Textures with Alpha Channels

至于 DXT2 和 DXT4 实际用的不多,从数据压缩算法上来讲,它们完全等同于 DXT3 和 DXT5 。区别只在于颜色数据是否经过 alpha 预乘。

既然是否作 alpha 预乘都可以在 dds 文件中使用专门的 4 字节标识,我奇怪的是,DXT1 中那么重要的通道信息居然不在 dds 文件头中表示出来。真不知道设计文件格式的人怎么想的。 >_<

DXT 图片压缩(DXTC/DirectX Texture Compression Overview)的更多相关文章

  1. 手游性能优化之深入理解Texture Compression

    http://gad.qq.com/article/detail/7154875 一.引子 手游项目开发日常里,经常有美术同学搞不清Photoshop制图软件与Unity3D游戏引擎之间的图片asse ...

  2. iOS图片压缩处理

    理解概念 首先,我们必须明确图片的压缩其实是两个概念: “压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降. “缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体 ...

  3. iOS 图片压缩方法

    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...

  4. iOS学习——图片压缩到指定大小以内

    一.图片压缩简述 在我们开发过程中,有可能会遇到拍照.或者从相册中选择图片,要么单选或者多选,然后上传图片到服务器,一般情况下一张图片可能3-4M,如果类似微信朋友圈上传9张图片大约是 35M左右,如 ...

  5. Luban 鲁班 图片压缩 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. ZH奶酪:PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)

    1.调用TinyPng网站提供的API 1.1.须知 (1)tinypng的官网:https://tinypng.com/ 不知道国内访问会不会很慢,在Singapore打开这个网站很流畅: (2)A ...

  7. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  8. 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)

    涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...

  9. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

随机推荐

  1. Kafka入门经典教程【转】

    问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有 ...

  2. windows下使用pip安装python模块lxml

    pip install lxml 1 1 会有如下问题:  结果一路解决下去,解决了一个坑还是有一个坑,遂放弃,查找有没有别的解决办法. 亲测使用wheel+pip可以成功安装lxml! wheel本 ...

  3. 不能访问本地服务器场。没有注册带有FeatureDependencyId 的 Cmdlet

      不能访问本地服务器场.没有注册带有FeatureDependencyId 的 Cmdlet. 原因: 我有两个域管理员账号,分别:sp\administrator,sp\spadmin 其中后者才 ...

  4. 爬虫、框架scrapy

    阅读目录 一 介绍 二 安装 三 命令行工具 四 项目结构以及爬虫应用简介 五 Spiders 六 Selectors 七 Items 八 Item Pipeline 九 Dowloader Midd ...

  5. 四、vue语法补充

    1.自定义过滤器 格式: {{ msg | filters}} 2.computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter <!DOCTYPE html> ...

  6. mapreduce的组件介绍

    第一部分:重要的组件 Combiner •什么是Combiner •combine函数把一个map函数产生的<key,value>对(多个key, value)合并成一个新的<key ...

  7. Android Studio 入门级教程(三):gradle项目构建

    声明 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4456420.html [系列] Andr ...

  8. ajax和jsonp

    ajax和jsonp 前言:ajax和jsonp可以与后台通信,获取数据和信息,但是又不用刷新整个页面,实现页面的局部刷新. 一.ajax 定义:一种发送http请求与后台进行异步通讯的技术. 原理: ...

  9. ngResource和REST介绍

    ngResource和REST介绍 一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding ...

  10. 【LOJ】#2117. 「HNOI2015」实验比较

    题解 把所有=的点连起来,一个图合法肯定它是一个有向树森林 我们新建一个点,把这个点和其他所有树的树根连起来 定义\(dp[u][j]\)表示第u个点长度为j的序列的方案数 转移方法是 \(dp[u] ...