Hello . 大家好,今天和大家一起来了解一下图片纹理压缩格式Block Compression工作技巧,我是木偶心没。
现在很多的3D游戏都是用一些简单纹理格式,DXT或者BC系列来压缩纹理,减少纹理贴图的内存占用。这次我们主要探究的是GPU支持的BC1-7的纹理压缩格式。
1、为什么要进行纹理压缩
虽然目前市场上的硬件功能已经取得了巨大的进步,但是,贴图采样在一个shader中变得越来越昂贵。而且,我们的审美期望也随着硬件的改进而增长,一直在寻求更多具有更高分辨率的纹理,以增加视觉细节并减少重复。
随着有些着色模型变得越来越复杂,每种材质都需要更多的纹理: basecolor, normal, roughness, emissive等。纹理压缩能将更多的像素塞进游戏中,极大地减少了将这些像素放入GPU着色器核心所需要的内存宽带。
2、Block Compression
BC就代表Block Compression(块压缩),而且BCn压缩格式全部以4x4的像素块为单位。压缩的时候,所有的图片都被切成这些小块,每个块都是独立的,即要解码的数据全部位于内存中的一个连续块中。另外,每个压缩块的大小都是固定的8或者16bytes,取决于使用的是哪一种BCn格式。如果原图像为8位RGBA格式,则表示4:1或者8:1的压缩率。
这种标准的块布局旨在使GPU轻松使用这些格式进行渲染。GPU能够快速访问纹理的任何部分。他们会顺序读取整个图像,因此流压缩算法和压缩率可变的算法不适合该应用程序。
另外,纹理样本通常在两个维度上都表现出局部性,也就是说,如果访问纹理中的一个像素,则很可能也会访问2D附近的其他像素。4x4块结构很好的支持了这一点,因为可以方便地一次将所以16个像素解压缩,然后存储在纹理缓存中,在那里他们可以有效地重用于其他采样操作。
前三种的BCn也被称为DXT1,DXT3和DXT5.
所有的BCn格式都是,在任何区域内(例如4x4块),存在的颜色集变化有限,也就是说,在一个块中,我们通常只有一种颜色的较深和较浅的阴影,或者(在拐角和边缘处)两种对比颜色之间的渐变或者混合。如下图;
BCn图像中的每个块都有一个很小的调色板(palette),只有几种颜色可以选择。压缩的时候将像素编码为该调色板(palette)的索引,由于调色板(palette)很小,每个像素占用的位数也不会太多。假定调色板(palette)的所有颜色均沿RGB空间中的线段均匀分布,从而进一步压缩了调色板(palette)。然后,该文件仅需存储该行的端点,并且通过以不同的比例混合两个端点来得到调色板(palette)上的其他颜色。
所有的BCn块均包含两个主要数据:这些色彩空间线段的端点以及每个像素的调色板(palette)索引,该索引表示每个像素沿线的距离。
因为BCn格式的块存储的颜色集变化有限,所以多数BCn格式在单个块中存在三种非常不同的颜色的任何地方都会给出质量较差的结果。例如包含红绿蓝三色混合的块无法使用简单的BCn格式表示,因为红色,绿色和蓝色不在RGB空间中沿直线放置。这给通常具有这种情况的法线贴图带来了问题。而上面显示的砖之类的颜色纹理通常可以经受BCn压缩而几乎没有可见的退化。
如图是使用BC1压缩和没有压缩的四个块对比
可以看出来,每个块的颜色都不超过四种不同的颜色(BC1使用四种颜色的调色板(palette)),并且细微的色调变化已经消失(因为这四种颜色必须位于RGB空间中的一条线上)。单个块上会比较明显,但是其实放到整张图上面就没有太大的差别了,除了一些阴影部分和明亮区域的边缘。
3、BC1
BC1存储RGB数据。从技术上讲,它支持Alpha通道,但是Alpha通道仅为1位(即,它必须为0或者255)。它使用8个bytes来存储每个4x4块,从而使其平均数据速率为每个像素0.5个bytes。每个块由两个颜色端点组成,每个端点以RGB5:6:5格式存储在2bytes中。调色板(palette)包含从这些端点生成的四个颜色,因为索引需要每个颜色2bits,从而构成该块的其他4bytes。
BC1是大多数标准版彩色图的不错选择,除非有特殊的原因要使用其他的格式,比如说,图像需要平滑的渐变。因为RGB5:6:5的比例,BC1无法很好地表示平滑的渐变。如下;
4、BC4
BC4存储灰度图像(没有RGB,仅存储一个颜色通道),每个块使用8个字节,他的端点各为一个字节,并且使用8元素的调色板(palette),因此每个像素具有3bits的索引。
BC4和BC1的大小相同,但是由于调色板(palette)扩展到8而不是4,端点精度也扩展到8而不是5-6,因此在存储灰度图像时,它的质量比BC1好得多。这使BC4用在heightmaps,gloss maps和其他种类的灰度纹理上面效果会很好。这里比较一下与上面BC1的渐变质量:
可以看出,BC4压缩的梯度和未压缩的原始图像之间几乎没有可见差异。
5、BC2,BC3和BC5
这两种格式只是前两种格式的组合。BC3存储RGBA数据,对于RGB部分使用BC1,对于Alpha部分使用BC4,其总块大小为16bytes,或者每个像素平均1 bytes。这是需要完整alpha通道的纹理的最常见格式。也可以用于将颜色纹理和任何灰度图像打包在一起,由于alpha与颜色分开存储,因为BC3在颜色部分中不适用BC 1 bits的alpha模式。
BC5是一种两通道格式,其中每个块只是两个BC4块。
如果在像素着色器中存储了X和Y分量并重建了Z分量,则这对normal map非常有用。由于每个通道都有自己的蹲点和索引,因此normal map在BC5中比在BC1中保留更多的保真度。然而缺点是BC5需要使用两倍的内存,每个块16bytes。这也可能使着色器的访问速度变慢,因为需要更多的内存带宽才能将纹理传递到着色器核心。
BC2因为很少使用,所以不做讨论了。
6、BC6和BC7
BC6和BC7仅在D3D11级图形硬件中受支持,比楼上的任何格式都要复杂。他们每个块占用16bytes,与BC3和BC5相同。BC7针对8位RGB或RGBA数据,而BC6针对RGB半精度浮点数据。因此,BC6是唯一一种可以原生存储HDR图像的BC格式。
BC6和BC7如此复杂的原因是,他们允许使用各种不同的模式来更改格式的细节,例如调色板大小和端点的存储方式。模式由每个块的前几位指定,因此每个块可以有效得具有不同的格式,所以BC6和BC7非常适合图像内容,因为他们可以为每个4x4块选择最佳模式。但是比较不好的事,压缩到BC6和BC7更加困难和缓慢,因为压缩器有更多选择来尝试实现每个块的最佳质量表示。
下面是BC7压缩砖纹理的四个块
以及整个砖块上面的效果
可以看到效果接近完美,差别不是很大。而且BC7在渐变示例上也表现出色;
所以根据上述各BCn格式的特点,可以针对不同的贴图进行使用。比如在unreal中,我们可以看到默认已经设置好了各种贴图选择的压缩方式;
默认的贴图比如Basecolor等就一般使用BC1或者BC3;而Normal Map则使用BC5会比较好;HDR环境贴图使用BC6;一些只需要灰度值的Alpha则使用BC4。
来源:Thepoly公众号
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答023年以来,在版号审批、出海政策等影响下,新品游戏大量涌现,这也为游戏市场带来了一些新变量、新现象。
学习游戏开发班可以帮助游戏爱好者从零基础成为游戏开发专家,掌握全面的游戏开发技能。
火星时代教育为您提供专业的界面设计实战班,在实践中掌握界面设计的核心技巧和最新趋势,成为优秀的UI设计师。
了解UI交互设计培训的最佳选择,比较不同培训机构的优势和特点。
火星时代教育为您推荐专业的学影视后期培训机构,提供高质量的培训内容及资深导师指导,助您成为优秀的影视后期剪辑师或合成师。
火星时代教育是一家专注于交互设计培训的机构,为学员提供专业的交互设计培训课程,并帮助他们成为优秀的交互设计师。
1. 打开微信扫一扫,扫描左侧二维码
2. 添加老师微信,马上领取免费课程资源
同学您好!