ARM Mali系列GPU加强应用ASTC技术—高动态范围成像和3D

KhronosARMASTC技术(自适应可伸缩纹理压缩技术)列为业内标准纹理压缩的新方案。ASTC技术支持高动态范围成像和三维纹理压缩,我将花些时间演示如何处理纹理,以及在图像内容中它们可以采用怎样的冷色效果。


高动态范围成像(High Dynamic Range)


正常颜色(低动态范围成像或LDR)的图片在屏幕上显示的颜色亮度为介于0(最低亮度)到1(最高亮度)的相对较低的动态范围。超出该范围则不能显示,原因在于,你既不能将颜色调得比黑色更暗,也不能让显示器的亮度超出其最大亮度值。


尽管如此,在计算确定屏幕上的最终色彩像素时,你通常想让亮度超出这一范围值。例如,物体表面的一道亮光,在调至表面的较暗色彩前,其亮度可能是最大亮度值的两倍。如果只能在0到1之间进行调节,那么不管你在上面打多强的光,画面也无法调得比底色更亮。对于简单的照明,这处理起来相当方便,你可以通过计算将原有的任何亮度调至你想要的亮度,而较高级的照明技术则通常利用纹理来支持光密度和色彩。不过如果我们只有低动态范围纹理,进行此项操作则较麻烦。或许可以调节鲜艳色彩相关的纹理数值,不过,由于亮度梯度的线性区间影响,会在较暗区域形成条带效应,视觉效果较差。同样,对于显示有光有影场景或有光源场景的纹理,如果采用LDR,则可能出现以下方面的问题,即:明亮区域偏亮、暗区不够清晰,或者保持阴影的精度和调暗明亮区域。


我们所需要的显示方案,应该既允许更大的动态范围,又能在较暗区域采用较小梯度显示色彩。来看看高动态范围成像(HDR)纹理吧。



利用ASTC技术以3.56bpp压缩而成的HDR图像,采用三种曝光方式显示


OpenGL® ES中,可以采用16比特浮点数值来指定HDR纹理。但是,典型的RGB纹理相当于48比特每像素(48bpp),而多数设计人员均不满意每像素24比特典型纹理所占用的空间,如果采用48bpp,则所占空间为两倍,这是一个较大缺陷。因此,我们需要进行压缩。


支持HDR


你可能会想到,ASTC技术可以采用不同编码模式处理图像中的各种纹理单元块,要确保选择最有效的模式,则取决于单元块的图像内容。在前一篇日志中,我们谈到LDR编码方案,不过ASTC技术也包括若干HDR编码模式,可以修改色彩存储和插补的方式。如果一个单元块所含的一系列像素值包括明暗纹理的适当分布,或纹理数值范围超出0~1,则色彩会以12比特伪对数的显示方案储存,它便于在解码器中转换成真正的浮点形式。这种显示方案的优点在于,我们在LDR中采用的相同线性插值,可以运用到对数值中,从而使此类数值将我们用于显示明暗的数值分隔开来,其产生的视觉畸变也最小。需进行的额外步骤是,在进行编码时,需将传入的浮点纹理值变成伪对数值;在解码时,最终将结果转换为浮点值。由于编码已选定,所以这些功能操作起来相当简单。一旦进行转换,ASTC技术会以同样方式将这些数值作为LDR数值处理,从而节省了硅芯片面积,并允许在LDR模式下进行灵活选择。


纹理创建者可以决定采用HDRLDR来达到同样的色彩格式和比特率。当然,在许多情况下,HDR图片比LDR图片包含更多的信息,因此需采用更高的比特率。我们用HDR图片所做的实验显示,与8比特每像素相比,ASTC技术可以做出的效果接近于BC6H(现有的de facto HDR压缩标准)。尽管如此,能够得益于低比特率的HDR图像内容种类有很多(光照图是其中一种),而让这种操作变得可行很有意义。 


3D纹理


OpenGL, OpenGL ESDirectX APIs均支持3D纹理,但它们的利用率并不高。原因不难解释——它们较占空间。256x256RGB纹理较小,未压缩情况下占据192KiB空间。要在3D中获得同样的像素解决方案,要求纹素为256x256x256,其所占空间较大,为48MiB。对于多数应用程序而言,这便是3D技术人员所谓的“太大”。显然,我们不是要求压缩技术支持3D纹理,而是要让3D纹理能够被压缩。


现如今,压缩方案通过简单地压缩 2D 切片已可以全面支持 3D 。在 256x256x256 这一案例中,我们简单地将它作为 256 个独立的切片,每条切片均为 256x256 像素点,然后单独压缩每条切片,并将它们连成矩阵。这样做在性能和质量两方面存在弊端。

性能问题取决于你如何看待3D纹理。如果你正在展示一个面,它与你编码的切片方向平行,而一个纹素解码操作只需进入单个切片内的数据单元块。你还极有可能在同一单元块内或在缓存中发现附近的像素点。


但是,如果你的画面是垂直方向映射,你将需要访问更多的纹理单元块,影响带宽和抖动纹理缓存。这样会形成较大程度的性能从属,而这不是关于复杂性或内容构造等方面的可控内容,而是不可预见的视角。这真令人讨厌!


第二个问题是,在 3D 纹理中,我们通常显示的是实际容积数据,而真实的纹理特点是三维的。因此纹理中的这些数值与切片关联,这便是压缩算法可以开发的内容。如果你将这些切片分开,会妨碍压缩并导致在给定的比特率下形成质量较低的图片。

ASTC技术的3D模式引入了一种新理念——压缩数据中一个128比特的单元块可以覆盖一个3D足迹(从3x3x3像素点到6x6x6像素点,梯度在二者之间)。这相当于将比特率从4.7调低至 0.56比特每像素。由于单元块是立方体(或接近立方体,类似于4X4X5的规格也可操作),无论从哪个方向看,它们都是相似的。通过切片方法查看,几乎完全消除了性能方面的较大差异。

我们演示了利用ASTC技术在2比特每像素的情况下进行3D纹理编码。这相当于8X8像素点单元块的切片,或采用4X4X4像素单元块进行3D本地编码。3D编码可将本地质量提高约为2dB,说明图层之间更多的关联性可以通过压缩算法进行利用,从而使质量大幅提高。


对于包含边界清楚的不同色彩区域的3D纹理而言,我们还会发现这种定义纹理划分的方法的一大优点。如果将这种方法用作函数而非表格,则可轻松(一旦你意识到这种可能性)定义关于XYZ的函数,而非仅仅是XY的函数。无需大型ROM,只需最低的附加硬件成本,我们便可得到一份3D分区表。

3D单元块需要对像素加权矩阵的布局进行修改,不过这正适合128比特单元块的构造,并可重新利用2D情形下的大量功能单元。例如,有一种巧妙的方法是采用简单内插的方式在加权值中插入数值,而非通过三维插值来计算有效的加权值。这样操作可以减小与2D双线性内插相同的工作量,而且我们可以重新利用相同的内插硬件,节省电力和空间。

让我们切换到常规问题吧:是的,这是另一种自主选择,因此ASTC技术还支持3D HDR纹理!不过,你还期待什么?


互动


获得ASTC技术评估编解码器,请访问Mali Developer Center,可支持LDR,HDR和3D纹理压缩。


你是否有HDR3D纹理方面的新应用?在评论中与我们分享吧!


Sean EllisARM媒体处理部技术团队的一员


他于1988年开始从事3D图形工作,包括ARM最初的机器产品Archimedes。他是Java移动3D图形标准规范(M3GM3G2)的主要制定者。目前工作是界定ARM下一代GPU的架构。他还参与专利工作,保护ARM在多媒体领域的创新成果。


原文链接:http://blogs.arm.com/multimedia/1011-more-astc-in-arm-mali-gpus-high-dynamic-range-and-3d

你可能感兴趣的:(3D,amd,OpenCL,GPU,ARM)