优画质低功耗,空域 GPU 超分技术引领图像渲染新体验
随着大数据时代的发展,虚拟现实、增强现实等需要实时图像处理和计算的应用,对 GPU 加速引擎服务提出了新的挑战和机遇。
HarmonyOS SDK GPU加速引擎服务(XEngine Kit)提供的空域GPU超分能力,基于单帧输入图像,使用空间邻域信息实现超采样。当 GPU 性能不足以支持渲染高分辨率场景时,为了提高用户体验,可以使用空域 GPU 超分能力,将较低分辨率图像通过超分重建为高分辨率图像。相较于直接渲染高分辨率图像,使用超分能力能够降低 GPU 渲染负载,降低功耗。
功能演示
下面是空域 GPU 超分(GLES)功能演示,如果开发者对实现方式感兴趣,可以下载GLES Demo或Vulkan Demo体验,基于具体的应用场景优化。
![](https://static001.geekbang.org/infoq/7e/7e28dd896d123de43af687d58e41b84f.png)
空域 GPU 超分开发步骤
一、API 介绍
1.OpenGL ES API
![](https://static001.geekbang.org/infoq/1f/1ff0c430e6f23374f417e3af11531901.png)
HMS_XEG_SpatialUpscaleParameter 用于输入超分的参数,根据头文件提供的枚举可知,一共需要输入两个参数:
•XEG_SPATIAL_UPSCALE_SCISSOR 用于设置超分的采样区域,值为格式为长度为 4 的 int 型数组的地址。
•XEG_SPATIAL_UPSCALE_SHARPNESS 用于设置锐化度,值为 float 类型数的地址。
HMS_XEG_RenderSpatialUpscale 用于执行超分渲染,输入为待超分的纹理 id。
伪代码为:
当输入枚举 XEG_SPATIAL_UPSCALE_SCISSOR 为{0,0,textureWidth,textureHeight},调整 sharpness 值所对应的图像如下:
Sharpness=0:
![](https://static001.geekbang.org/infoq/69/691ab8becca5e23a187c7879e6aae5d0.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
Sharpness = 0.3:
![](https://static001.geekbang.org/infoq/c6/c605b86f2e1e41f2e0f58460e9d29515.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
将 sharpness 继续调高,sharpness = 1:
![](https://static001.geekbang.org/infoq/be/be40391285374246bcb8d7b1d1c3099c.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
当输入枚举 XEG_SPATIAL_UPSCALE_SCISSOR 为{ textureWidth/4,textureHeight /4, textureWidth/2,textureHeight/2}时,即:输入纹理从四分之一的宽高处开始,宽高长度为纹理的一半。超分效果如图:
![](https://static001.geekbang.org/infoq/76/768ce5ca8be0d7e1281dbcfef7c30108.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
原始图与超分 1.5 倍后图片对比如下:
![](https://static001.geekbang.org/infoq/ac/ac364b61e3c7b093b608fddb059c5962.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
![](https://static001.geekbang.org/infoq/a7/a7038a114efca28beaa20554b9edd9b5.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
2.Vulkan API
![](https://static001.geekbang.org/infoq/2f/2fc951f0796bd9291149c1d1223f9fff.png)
HMS_XEG_CreateSpatialUpscale 用于创建一个超分实例,构造参数是一个 struct,具体参数说明如下:
![](https://static001.geekbang.org/infoq/55/55062654e8672ec8a2d971447bc566df.png)
在创建时指定图像尺寸好处在于当一个实例创建完成后,后续使用过程中只需要传递超分的输入和输出图片即可。由于超分需要使用的 Vulkan 资源在此接口创建完成,在超分过程中仅进行绘制,开销很小。缺点是由于实例创建后输入输出的尺寸、锐化值等被固定,当有参数变化时,都需要重新创建实例,所以使用此接口时,最好先明确超分的尺寸,避免运行时进行超分实例的创建、销毁。
XEG_SpatialUpscaleDescription 用于执行超分,和一般 Vulkan 命令一样,此接口仅用于 Vulkan 的录制,录制完成后需要 submit 接口输入的 commandbuffer。
此接口的入参包括一个 vkcommandbuffe、创建完成的超分实例 xegSpatialUpscale,超分的输入输出结构体。XEG_SpatialUpscaleDescription 包括两个 vkiamgeview,分别是超分输入纹理和输出纹理的 vkimageview。
HMS_XEG_DestroySpatialUpscale:用于销毁超分实例 xegSpatialUpscale。
1)在 Vulkan 初始化时创建 xegSpatialUpscale。
2)执行超分命令,超分命令录制需要在 renderpass 外进行。
正常的 vk 命令录制,首先 begincommandbuffer。
结束一个 renderpass。
一个 renderpass 结束后,可以进行超分。
超分完成后,进行下一个 renderpass 命令的录制,直到全部的命令录制完成。
3)当进程准备销毁时,需要销毁超分实例。
超分效果图:
当 inputRegion 是输入纹理的全部区域,outputRegin 是输出纹理的全部区域,sharpness = 0:
![](https://static001.geekbang.org/infoq/d8/d83178b17b11a38e06fede369e20e31d.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
提高锐化度 Sharpness = 0.3:
![](https://static001.geekbang.org/infoq/a9/a9f3ba7b01df4f51871eb25a8bc21eaa.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
继续提高锐化度 sharnpness =1.1 此时已经出现锐化过度的现象:
![](https://static001.geekbang.org/infoq/74/74520e2295a70c7c6fb5146cbd3ba40a.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
当修改 inputregion 为输入纹理的中间区域,如{ inputTextureWidth/4, inputTextureHeight/4,inputTextureWidth/2, inputTextureHeight/2 }, 即:输入纹理从四分之一的宽高处开始,宽高长度为纹理的一半。超分结果效果如图:
![](https://static001.geekbang.org/infoq/b5/b514fd858dc069764b37ed4232c5044e.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
继续调整输出区域 outputRegion,如:{outputTextureWidth/3, outputTextureHeight/3, outputTextureWidth/2, outputTextureHeight/2},即从宽高的三分之一开启,宽高长度为纹理宽高的一半,效果如图:
![](https://static001.geekbang.org/infoq/61/6147f92db86792608612aa278226312f.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
上述例子通过修改 inputRegion 和 outputRegion 可以控制超分区域和采样区域。
原始图与超分 1.5 倍后图片对比如下:
![](https://static001.geekbang.org/infoq/21/21da572678fb0982fa742014f06bb72e.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
![](https://static001.geekbang.org/infoq/85/85e22f1e31e10324c7b83d98a52ee0c3.jpeg?x-oss-process=image%2Fresize%2Cp_80%2Fauto-orient%2C1)
注:本文演示图片部分素材来源于 Frank Meinl 制作的Crytek Sponza,Crytek 已根据CC BY 3.0获得授权许可。
了解更多详情>>
评论