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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

春夜喜雨

稀罕你的喜欢!!

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

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

打赏作者

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

抵扣说明:

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

余额充值