DDS的DXT5格式解析

参考:
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-不透明格式。

codealpha0 > alpha1alpha0 <= alpha1
0alpha0alpha0
1alpha1alpha1
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)/70
7(1alpha0 + 6alpha1)/7255

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}黑色。

codecolor0 > color1color0 <= color1
0color0color0
1color1color1
2(2*color0 + color1) / 3(color0 + color1) / 2
3(color0 + 2*color1) / 3Black{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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DDS(Data Distribution Service)协议报文格式是一种用于在分布式系统中进行数据交换和通信的协议。DDS协议是一种高性能、灵活和可靠的数据交换协议,适用于各种实时和嵌入式系统。 DDS协议报文格式一般包括以下几个部分: 1. 头部信息:包含报文的标识符、版本号等基本信息,用于标识报文的类型和版本。 2. 配置信息:包含DDS实体的配置信息,如发布者(Publisher)和订阅者(Subscriber)的数量、主题(Topic)的名称等。这些信息用于配置DDS实体的工作环境。 3. 数据内容:包含需要传输的实际数据内容。数据内容可以根据需要进行定义,可以是任意类型的数据,如整数、浮点数、字符串等。 4. 时间戳:包含数据生成或发送的时间戳,用于记录数据的产生时间和传输延迟等时间相关信息。 5. 其他元数据:包含附加的元数据信息,如数据的优先级、QoS(Quality of Service)策略等。这些元数据可以根据需要进行定义,以满足系统的特定需求。 DDS协议报文的格式可以根据具体的应用场景和需求进行灵活的定义。不同的厂商和实现都可能有自己的报文格式,但一般都会遵循DDS协议的规范。 总之,DDS协议报文格式是一种用于在分布式系统中进行数据交换和通信的格式,它采用灵活的结构,可以根据需要定义报文的各个部分,以满足不同应用场景的要求。这种格式的设计使得DDS协议具备了高性能、灵活和可靠的特性,适用于各种实时和嵌入式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值