参考:
https://www.khronos.org/opengl/wiki/S3_Texture_Compression
https://docs.microsoft.com/en-us/windows/desktop/direct3d10/d3d10-graphics-programming-guide-resources-block-compression#bc3
https://docs.microsoft.com/en-us/windows/desktop/direct3d9/opaque-and-1-bit-alpha-textures
https://docs.microsoft.com/en-us/windows/desktop/direct3d9/textures-with-alpha-channels
https://www.cnblogs.com/X-Jun/p/10262524.html
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3256899

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

格式识别:DXT5的Format格式值可采用以下标示识别出:
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
DXGI_FORMAT_BC3_UNORM
DXGI_BC3_UNORM_SRGB
DXGI_FORMAT_BC3_TYPELESS
FOURCC_DXT5
GL_S3TC_DXT5_RGBA
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT

DXT的介绍:

S3TC是一种高效的图形压缩格式,为图形渲染所使用,采用的颜色块压缩技术。不同于JPEG,PNG格式,这两种格式的解压是一次性解压全部内容,但S3TC格式可以部分解压,因为它采用4x4颜色块存储,每个颜色块都是独立的。
S3 Texture Compression (S3TC) (sometimes also called DXTn or DXTC) is a group of related lossy texture compression algorithms originally developed by Iourcha et al. of S3 Graphics, Ltd. for use in their Savage 3D computer graphics accelerator.
Standard image compression techniques like JPEG and PNG can achieve greater compression ratios than S3TC. However, S3TC is designed to be implemented in high-performance hardware. JPEG and PNG decompress images all-at-once, while S3TC allows specific sections of the image to be decompressed independently.
S3TC is a block-based format. The image is broken up into 4x4 blocks. For non-power-of-two images that aren’t a multiple of 4 in size, the other colors of the 4x4 block are taken to be black. Each 4x4 block is independent of any other, so it can be decompressed independently.
There are 3 forms of S3TC accepted by OpenGL. These forms are named after the old Direct3D names for these formats: DXT1, DXT3 and DXT.

DXT5压缩格式

DXT5压缩格式,采用逐个Cell-压缩块存储顺序的方式,例如16 * 16个像素的dds图片,会有4 * 4个Cell压缩块,Cell逐个表达:
(x-列,y行)(1,1)->(4,4),(5,1)->(8,4),(9,1)->(12,4),(13,1)->(16,4)
(x-列,y行)(1,5)->(4,8),(5,5)->(8,8),(9,5)->(12,8),(13,5)->(16,8)
(x-列,y行)(1,9)->(4,12),(5,9)->(8,12),(9,9)->(12,12),(13,9)->(16,12)
(x-行,y列)(1,13)->(4,16),(5,13)->(8,16),(9,13)->(12,16),(13,13)->(16,16)

压缩比: DXT5压缩方式采用16个字节颜色块,压缩4 * 4个RGBA值,平均每个像素值(RGBA)占1个字节。压缩比为4:1。

存储方式: 前4个字节存储Alpha通道,后4个字节存储颜色值。

表达范围: 每个颜色块表达4 * 4矩阵的像素(RGBA)值,例如第一个颜色块表达的区间为[(1,1),(4,4)]像素空间,表达了第1-4行前4个像素。

Alpha块解析简述: Alpha占8个字节空间,对于DXT5来说,解析方式不同于DXT3,解析方式和颜色块的方式有所类似。
8个字节中:alpha0|alpha1|6字节-3bit索引值,共计3bit * 16个|
索引值:3bit+alpa0与alpha1大小比较,共计可以表达16种取值方式,实际表达14种取值方式,因为索引值000,001不参考alpa0与alpha1比较,直接分别取alpha0,alpha1。

Color块析简述: Color占8字节,解析方式与DXT1/DXT3相同。
8个字节中:color0-2字节|color1-2字节|4字节-2bit索引值,共计2bit*16个|
索引值:2bit+color0与color1大小比较,共计可以表达8种取值方式,实际表达6种取值方式,索引值00,01不参考color0与color1比较,直接分别取color0与color1.
颜色值:color0与color1都为RGB565颜色值格式

Alpha块解析

8字节:alpha0|alpha1|6字节-3bit索引值,共计3bit*16个|
Alpha块,颜色alpha0和alpha1直接读取到byte型中即可,取值范围0-255,代表透明度。
索引值块,每3bit为一个索引值,块的存储顺序格式是从低bit到高bit,分别对应第一行第一个,第一行第二个…第四行第四个
读取索引值时,需要采用的是小端(little endian),并且从低bit到高bit。

–来自microsoft参考文档中的图片:

3bit+alpa0与alpha1大小比较,共计可以表达16种取值方式,实际表达14种取值方式。
其中alpha0>alpha1时,可以表达8种线性采样值;
alpha0<=alpha1时,表达6种线性采样值,并额外表达0-全透明和255-不透明格式。

code alpha0 > alpha1 alpha0 <= alpha1
0 alpha0 alpha0
1 alpha1 alpha1
2 (6alpha0 + 1alpha1)/7 (4alpha0 + 1alpha1)/5
3 (5alpha0 + 2alpha1)/7 (3alpha0 + 2alpha1)/5
4 (4alpha0 + 3alpha1)/7 (2alpha0 + 3alpha1)/5
5 (3alpha0 + 4alpha1)/7 (1alpha0 + 4alpha1)/5
6 (2alpha0 + 5alpha1)/7 0
7 (1alpha0 + 6alpha1)/7 255

Color块解析

8个字节:color0-2字节|color1-2字节|4字节-2bit索引值,共计2bit*16=4byte|
color1,color2为RGB565格式:
按小端存储,低byte在前;
按照RGB顺序,从高bit到低bit,依次存储R-5bit,G-bit,B-5bit。
The 2 16-bit color values are stored in little-endian format, so the low byte of the 16-bit color comes first in each case. The color values are stored in RGB order (from high bit to low bit) in 5_6_5 bits.
提取值之后,把值映射扩展到0-255取值方式,RGB可以分别采用<<3, <<2, <<3得到颜色值。

索引值块
索引值块占4个字节,每2bit为一个索引值,同alpha块一种,块的存储顺序格式是从低bit到高bit,分别对应第一行第一个,第一行第二个…第四行第四个
读取索引值时,需要采用的是小端(little endian),并且从低bit到高bit。

索引值:2bit+color0与color1大小比较,共计可以表达8种取值方式,实际表达6种
其中alpha0>alpha1时,可以表达4种线性采样值;
alpha0<=alpha1时,表达3种线性采样值,并额外表达RGB{0,0,0}黑色。

code color0 > color1 color0 <= color1
0 color0 color0
1 color1 color1
2 (2*color0 + color1) / 3 (color0 + color1) / 2
3 (color0 + 2*color1) / 3 Black{0,0,0}

DDS对MIPMAP的支持

DDS支持MIPMAP,熟悉OpenGL和Direct图形编程的化,对纹理mipmap都会比较了解,MIPMAP提供纹理的分层。当图片距离较远,屏幕一个像素对应的图片像素数较多时,是不必要的,且容易产生颜色干扰,此时采用较高界别的纹理,减少对应的图片像素数,简化了纹理,提高效率。

MIPMAP存储的时候,按照级别依次进行存储,大小依次递减
例如: 512长宽的图片会分为10级,依次减少:长宽减少到1/2,像素数减少到1/4。
512512->256256->128128->6464->3232->1616->88->(44->22->11)

建立分级的DDS图片文件,占用的空间会增加约1/3。
Sn = 1+1/4+1/16+1/64+…
通过等比数列公式可以求得:
Sn = (1-(1/4)^n) / (1-1/4)
当n=10时,Sn=1.33331299…约为=1+1/3

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

DDS的DXT5格式解析相关推荐

  1. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  2. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

  3. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  4. 日期/时间格式/解析,Java 8样式

    自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期和时间. 在这段时间内, ...

  5. 3D模型格式解析(OBJ)

    文章目录 OBJ格式解析 一.OBJ格式 二.vtkOBJReader源码解析 1.主要部分 总结 OBJ格式解析 通过解读vtk源码中对OBJ文件的读取代码,讲解如何获取obj模型的顶点(verte ...

  6. c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)

    在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...

  7. mysql binlog c++_MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  8. JSON格式解析和libjson使用简介-转

    Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSON格式的简单概念及JSON在Rss Reader中的应用. JSON格式解析和libjs ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

最新文章

  1. C#通过VS连接MySQL数据库实现增删改查基本操作
  2. java mysql访问类_java 访问数据库公共类
  3. 天天 Java、C/C++,可这五种编程语言你知道吗?
  4. python类之间传参_没看懂这11 条,别说你精通 Python 装饰器
  5. 怎么打开优酷的kux格式?教你把kux转换成mp4的方法
  6. nba2k21那个php是啥,NBA2K21不同版本区别介绍 各版本详细信息及奖励内容一览
  7. 126邮箱国外服务器,OUTLOOK连126邮箱能不能向国外新闻组投递邮件?哪些邮箱服务器可以?...
  8. 阻止浏览器冒泡和默认行为
  9. 从零到一,美芽的技术实战
  10. 在网页中内嵌视频,例如优酷
  11. 为什么说盲盒市场充满机遇
  12. Qt动态翻译不生效!
  13. coco数据集大小分类_2019-08-15 COCO数据集
  14. 【Java篇】第三话-你真的了解抽象类吗?
  15. 这位答主是否夸大了《编码》这本书?我在知乎的高赞回答(及本书勘误表)
  16. 内容运营是什么?怎么拉动用户增长
  17. 【ArcGIS平台系列】Apps,新一代WebGIS平台的入口
  18. Node.js 的安装与配置
  19. 国产数据库厂商都怕低价竞争?阿里云却说这不是最可怕的
  20. CVPR2022自适应/语义分割:Class-Balanced Pixel-Level Self-Labeling for Domain Adaptive Semantic Segmentation

热门文章

  1. SQL 基础篇 SQL 16 查找GPA最高值
  2. Houdini 自定义节点参数面板 hou.ParmTemplate学习笔记
  3. 计算机制造技术飞速发展 使用计算机,机械设计制造及其自动化中计算机技术的应用分析...
  4. Deep Stable Learning for Out-Of-Distribution Generalization
  5. c语言中单引号b是啥意思,c语言中单引号和双引号的区别和应用?
  6. flex的align属性:交叉轴的对齐方式
  7. 数据科学包——Day2
  8. 笔记本连接html后分成两个屏,笔记本电脑关掉自带显示屏,外接两个显示器做分屏的实现方法。...
  9. 内网网速取决于网络设备,而外网网速取决于带宽和用户多少
  10. 天易26----java导出excel表格(支持wps和office excel)