| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> unity图像压缩算法原理 -> 正文阅读 |
|
[游戏开发]unity图像压缩算法原理 |
概述在计算机图形学中,存在许多纹理压缩方案。压缩既减少了纹理内存占用,又降低了使用纹理的带宽要求。本文中,“纹理压缩”与“图像压缩”不同,因为纹理压缩方案的设计允许作为纹理采样的一部分进行有效的随机访问。“图像压缩”可以通过将图像视为一个整体来进一步减少图像冗余,但这样做对于有效的纹理访问操作是不切实际的。本文主要介绍几种unity当前主流的图像压缩算法,并给出推荐理由。 unity图像压缩算法原理目的纹理在移动和桌面图形中无处不在。它们为广泛的应用程序(如游戏或导航应用程序)添加了一定程度的真实感,其中图像质量和加载时间等因素的组合对智能手机、平板电脑和便携式控制台用户至关重要。通常,此类内容越来越多地要求更高分辨率的更高质量,以提高整体质量标准。这意味着计算系统需要获得功能、原始图形和计算性能以及软件工具的正确组合,以有效利用所有可用资源。 尽管艺术家和开发人员在纹理设计和贴图方面所做的努力很少受到赞赏,但游戏玩家可以快速识别与纹理压缩相关的问题,如低分辨率、压缩瑕疵或锯齿。因此,在开始任何应用程序的开发工作时,采用和维护正确的压缩标准对于取得成功至关重要。 现代应用已变得图形密集;某些类型的软件,如游戏或导航辅助工具,通常需要大量纹理才能以令人满意的质量表示场景。纹理压缩可以节省或允许更好地利用带宽、电源和内存,而不会明显损失图形质量。
术语bpp : Bits per pixel,每像素占用位数,是单个纹理像素所需的存储量。bpp值较低的纹理在磁盘和内存中的大小较小。较低的bpp值还意味着GPU可以在其缓存中存储更多像素,从而加快纹理访问速度。 算法以下是本篇文章主要内容,介绍现在比较主流的图像压缩算法。 S3TCS3TC也叫 DXTC(或BC)为微软为DX而推出的基于block的贴图压缩格式,其主要采用调色板的原理来进行压缩。 1. BC1 with no alpha基于4x4 block来进行,共64位,不含有alpha通道,图像被视为完全不透明。
对于每个块内的texel,存储2bits的索引,用来指向到4个基准颜色中的一个。所以对于BC1的压缩状态为64bits: 2. BC1 with alpha每个4×4 texel块由64位RGB图像数据和最小alpha信息组成。texel的RGB分量以与BC1 没有alpha时相同的方式提取。
最终alpha为0的任何texel的红色、绿色和蓝色分量应编码为零(黑色)。如果格式为带alpha的BC1,则code(x,y)= 3是透明的(alpha=0)。如果格式为BC1,没有alpha,则代码(x,y)=3表示不透明黑色。 3. BC2BC2在BC1的基础上支持了a值。它将4x4共16个像素存储为128位数据,其中包括64位a通道(每像素4位)和64位颜色通道,RGB和DXT1一致,即两个16位RGB值和16个2位索引表。它的透明度只有4位共16种数值. 4. BC3BC3在BC1的基础上支持alpha通道。首先,RGB的存储方式与BC1相同,需要64bits;对于alpha部分,使用与RGB部分相同的策略来处理。在block存储两个基准的alpha值,然后在其基础上插值得到其它6个共计8个alpha值,来做为alpha的调色板;然后对于每个texel存储一个3bits的索引,用来指向到这8个alpha中的一个。所以其对应的存储状态为:
BPTCBC6H未完待续 BC7未完待续 ETC1纹理被描述为若干4×4像素块。如果纹理(或特定mipmap级别)在任何维度上小于4个像素(例如2×2或8×1纹理),则纹理位于块的左上部分,其余像素不使用。例如,大小为4×2的纹理将放置在4×4块的上半部分,而块中像素的下半部分将不被访问。
在这两种模式中,4×4的block被分为两个子块,大小为2×4或4×2。这是由位32控制的,我们称之为flip bit。如果flip bit=0,则块被并排分成两个2×4子块,如图7所示。如果flip bit=1,则该块被划分为两个相互重叠的4×2子块,如图8所示。 ETC2 (不带alpha)根据ETC1的实现方式,如果其块内的颜色分布不均匀的话,则其存储的两个basecolor会较远的分布于插值趋线的较远的两侧,进行解压后会得到较低的压缩质量。因而ETC2就是解决如何针对这些较为特殊的颜色分布来选择更加优化的压缩策略。改进主要针对ETC1中的diff为1的情况下展开. 对于RGB ETC2,每个64包含关于三通道4×4像素块的信息,如图10所示。 使用五种不同的“”之一对块进行压缩。表63的a部分显示了用于确定给定块中使用的模式的位。 b)与ETC1一样的 diff = 0, 使用“individual”模式。如果R=14=1110二进制(简称1110b),G=3=0011b,B=8=1000b,则子块1的基色的红色分量变为11101110b=238,绿色和蓝色分量变为00110011b=51和10001000b=136。子块2的基色解码方式相同,但使用4位码字R2(位59…56)、G2(位51…48)和B2(位43…40)。 c) 与ETC1一样的 diff = 1, 使用“differential”模式,子块1的基色源自五位码字R、G和B。通过将前三个最高阶位复制到三个最低阶位,将这五位码字扩展到八位。例如,如果R=28=11100b,则得到的八位红色分量变为11100111b=231。同样,如果G=4=00100b和B=3=00011b,则绿色和蓝色分量分别变为00100001b=33和0001100B=24。因此,在此示例中,子块1的基色为(231、33、24)。子块2的基色的五位表示是通过用码字Rd、Gd和Bd修改五位码字R、G和B来获得的。Rd、Gd和Bd中的每一个都是一个三位二补数,可以保持-4和+3之间的值。例如,如果如上所述R=28,并且Rd=100b=y-4,则红色分量的五位表示为28+(-4)=24=11000b,然后将其扩展到八位,以11000110b=198。同样,如果G=4、Gd=2、B=3和Bd=0,则子块2的基色将是RGB=(198、49、24)。 d) T字型分布,一部分颜色沿插值趋线分布,另外的颜色分布于距离较远的位置上,如蓝色点所示 “H”模式也会计算“d”值,但这样做稍微复杂一些。为了将三位索引构建到表66中所示的距离表中,表63 e部分中所示的da和db分别用作最高有效位和中间位,但最低有效位计算为(base color 1 value + base color 2 value),用于比较的颜色的“值”等于(R l 16)+(G l 8)+ B。确定“H”块的“距离”d g) ‘planar’ mode“,提供并使用三种基色来形成用于确定块中各个像素的颜色的颜色平面。平面分布型,其主要针对block块内的颜色分布于4个角落上的情形,如下所示: ETC2 (带alpha)RGBA:8888信息的每个4×4块被压缩为128位。要解码一个块,按照上节中的说明计算两个64位整数64bit Alpha和64bit Color。然后,**64bit Color*以与RGB ETC2相同的方式对RGB分量进行解码(参见ETC1 no alpha)。 PVRTC解压缩PVRTC编码的纹理意味着一个三步过程,该过程经过仔细优化,以提高硬件效率和降低功耗。以下以PVRTC 4-bpp为例
如上图所示,两张(w/4,h/4)大小的缩略图,产生了2张高精度的(w, h)的放大图,然后通过每一个像素2位的modulation 图混合得到最终的效果,算法:
bit占用如下:
在解码时,为了解码任意像素,必须读取4个相邻的PVRTC块,使用这4个块来解码一个5x5块。 PVRTC2PVRTC2的数据字布局与PVRTC1非常相似,但存在两个主要差异:
ASTC在Khronos定义OpenGL ES 3.0的同时,还致力于开发一种业界领先的压缩格式,为开发人员提供更细粒度的控制。在2012年年中推出了ASTC纹理压缩格式。ASTC的关键在于,虽然它使用固定的128位/块,但与先前格式的固定4x4块不同,每个纹理在这128位中可以有不同大小的块。ASTC利用各种各样的方形和非方形块大小,提供了广泛的派生压缩比,从8bpp扩展到1bpp以下,如下所示: 此外,ASTC还支持1-4个通道,包括全alpha RGBA、普通RGB、2通道RG(LA)和1通道R(L/A)支持,以及自定义X+Y和XY+Z法线贴图支持。最终结果是ASTC处理大多数类型的纹理。 ASTC的另一个关键优势是,编码端点、加权等的方法是按块选择的,而不是全局选择的,因此编码器可以动态调整以分配128位,以便更好地表示每个块中的内容。这提供了比以前的格式更好的图像质量,即使在更高的压缩。 支持ASTC的硬件已经达到足够的市场份额,开发者应该认真考虑如何在项目中使用它:提高质量,减少存储容量,或者两者兼而有之。这在需要足够高级别的图形硬件(例如ASTC是给定的)的项目中尤其如此。 推荐Windows对于使用DirectX 11或更高级别GPU的设备,如果保证支持BC7和BC6H格式,建议选择DXT1 four bits/pixel的RGB纹理-DXT1压缩格式。RGBA textures -BC7(质量越高,压缩速度越慢)或 DXT5(压缩速度越快),均为8位/像素。HDR textures -8 bits/pixel BC6H。如果您需要在PC上支持DirectX 10类GPU(2010年之前为NVIDIA GPU,2009年之前为AMD,2012年之前为Intel),则首选DXT5而非BC7,因为这些GPU不支持BC7或BC6H。 Android可选 ASTC, ETC2 and ETC (ETC1 for RGB, ETC2 for RGBA) IOS苹果设备 A8 chip (2014) 或者以上, ATSC对于 RGB 和RGBA 纹理是推荐的 ComputeShader下面给出unity下使用computerShader动态压缩BC3 ETC2 ASTC的算法实现 总结本文讲述了几种现在unity主流的压缩算法,安卓:用ETC2基本都支持了;至于ASTC在Android 5.0/OpenGL ES 3.1后支持,市场大部分机型都支持(98.5%),可以考虑选择,但毕竟是安卓,要做好处理兼容性的心里准备。 参考imaginationtech for PVRTC. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/28 3:39:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |