优画质低功耗,空域GPU超分技术引领图像渲染新体验

随着大数据时代的发展,虚拟现实、增强现实等需要实时图像处理和计算的应用,对GPU加速引擎服务提出了新的挑战和机遇。

HarmonyOS SDK GPU加速引擎服务(XEngine Kit)提供的空域GPU超分能力,基于单帧输入图像,使用空间邻域信息实现超采样。当GPU性能不足以支持渲染高分辨率场景时,为了提高用户体验,可以使用空域GPU超分能力,将较低分辨率图像通过超分重建为高分辨率图像。相较于直接渲染高分辨率图像,使用超分能力能够降低GPU渲染负载,降低功耗。

功能演示

下面是空域GPU超分(GLES)功能演示,如果开发者对实现方式感兴趣,可以下载GLES Demo或Vulkan Demo体验,基于具体的应用场景优化。

空域GPU超分开发步骤

一、API介绍

1.OpenGL ES API

HMS_XEG_SpatialUpscaleParameter用于输入超分的参数,根据头文件提供的枚举可知,一共需要输入两个参数:

•XEG_SPATIAL_UPSCALE_SCISSOR 用于设置超分的采样区域,值为格式为长度为4的int型数组的地址。

•XEG_SPATIAL_UPSCALE_SHARPNESS用于设置锐化度,值为float类型数的地址。

HMS_XEG_RenderSpatialUpscale用于执行超分渲染,输入为待超分的纹理id。

伪代码为:

float m_sharpness = 0.3;
int upscaleScissor[4] = {0, 0, 720, 540};
HMS_XEG_SpatialUpscaleParameter(XEG_SPATIAL_UPSCALE_SHARPNESS, &m_sharpness);
HMS_XEG_SpatialUpscaleParameter(XEG_SPATIAL_UPSCALE_SCISSOR, upscaleScissor);
...
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
glViewport(0, 0, 1080, 720);
glScissor(0, 0, 1080, 720);
HMS_XEG_RenderSpatialUpscale(textureID);

当输入枚举XEG_SPATIAL_UPSCALE_SCISSOR为{0,0,textureWidth,textureHeight},调整sharpness值所对应的图像如下:

Sharpness=0:

Sharpness = 0.3:

将sharpness继续调高,sharpness = 1:

当输入枚举XEG_SPATIAL_UPSCALE_SCISSOR为{ textureWidth/4,textureHeight /4, textureWidth/2,textureHeight/2}时,即:输入纹理从四分之一的宽高处开始,宽高长度为纹理的一半。超分效果如图:

原始图与超分1.5倍后图片对比如下:

2.Vulkan API

HMS_XEG_CreateSpatialUpscale用于创建一个超分实例,构造参数是一个struct,具体参数说明如下:

在创建时指定图像尺寸好处在于当一个实例创建完成后,后续使用过程中只需要传递超分的输入和输出图片即可。由于超分需要使用的Vulkan资源在此接口创建完成,在超分过程中仅进行绘制,开销很小。缺点是由于实例创建后输入输出的尺寸、锐化值等被固定,当有参数变化时,都需要重新创建实例,所以使用此接口时,最好先明确超分的尺寸,避免运行时进行超分实例的创建、销毁。

XEG_SpatialUpscaleDescription用于执行超分,和一般Vulkan命令一样,此接口仅用于Vulkan的录制,录制完成后需要submit接口输入的commandbuffer。

VKAPI_ATTR void VKAPI_CALL HMS_XEG_CmdRenderSpatialUpscale (VkCommandBuffer commandBuffer, XEG_SpatialUpscale xegSpatialUpscale, XEG_SpatialUpscaleDescription *pXegSpatialUpscaleDescription)

此接口的入参包括一个vkcommandbuffe、创建完成的超分实例xegSpatialUpscale,超分的输入输出结构体。XEG_SpatialUpscaleDescription包括两个vkiamgeview,分别是超分输入纹理和输出纹理的vkimageview。

HMS_XEG_DestroySpatialUpscale:用于销毁超分实例xegSpatialUpscale。

1)在Vulkan初始化时创建xegSpatialUpscale。

XEG_SpatialUpscale xegSpatialUpscale;
VkRect2D srcRect2D;
srcRect2D.offset.x = 0;
srcRect2D.offset.y = 0;
srcRect2D.extent.width = 960;
srcRect2D.extent.height = 540

VkRect2D dstRect2D;
dstRect2D.offset.x = 0;
dstRect2D.offset.y = 0;
dstRect2D.extent.width = 1440;
dstRect2D.extent.height = 810;

XEG_SpatialUpscaleCreateInfo createInfo;
createInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
createInfo.sharpness = 0.2f;
createInfo.outputSize = dstRect2D.extent;
createInfo.inputRegion = srcRect2D;
createInfo.inputSize = srcRect2D.extent;
createInfo.outputRegion = dstRect2D;
HMS_XEG_CreateSpatialUpscale(device, &createInfo, &xegSpatialUpscale);

2)执行超分命令,超分命令录制需要在renderpass外进行。

正常的vk命令录制,首先begincommandbuffer。

vkBeginCommandBuffer(cmdbuffer, &cmdBufInfo))
(beginerenderpassinfo省略)
Begine一个renderpass:
vkCmdBeginRenderPass(cmdbuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
(renderpass内录制命令,如vkCmdSetScissor、vkCmdBindPipeline等等)

结束一个renderpass。

vkCmdEndRenderPass(cmdbuffer);

一个renderpass结束后,可以进行超分。

XEG_SpatialUpscaleDescription xegDescription{0};
xegDescription.inputImage = inputTextureImageView;
xegDescription.outputImage = outputTextureImageView;
HMS_XEG_CmdRenderSpatialUpscale(cmdbuffer, xegSpatialUpscale, &xegDescription);

超分完成后,进行下一个renderpass命令的录制,直到全部的命令录制完成。

vkCmdBeginRenderPass(cmdbuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
VK_CHECK_RESULT(vkEndCommandBuffer(cmdbuffer));

3)当进程准备销毁时,需要销毁超分实例。

HMS_XEG_DestroySpatialUpscale(xegSpatialUpscale);

超分效果图:

当inputRegion是输入纹理的全部区域,outputRegin是输出纹理的全部区域,sharpness = 0:

提高锐化度Sharpness = 0.3:

继续提高锐化度sharnpness =1.1 此时已经出现锐化过度的现象:

当修改inputregion为输入纹理的中间区域,如{ inputTextureWidth/4, inputTextureHeight/4,inputTextureWidth/2, inputTextureHeight/2 }, 即:输入纹理从四分之一的宽高处开始,宽高长度为纹理的一半。超分结果效果如图:

继续调整输出区域outputRegion,如:{outputTextureWidth/3, outputTextureHeight/3, outputTextureWidth/2, outputTextureHeight/2},即从宽高的三分之一开启,宽高长度为纹理宽高的一半,效果如图:

上述例子通过修改inputRegion和outputRegion可以控制超分区域和采样区域。

原始图与超分1.5倍后图片对比如下:

注:本文演示图片部分素材来源于Frank Meinl制作的Crytek Sponza,Crytek已根据CC BY 3.0获得授权许可。

了解更多详情>>

访问GPU加速引擎服务官网

获取空域GPU超分开发指导文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/789391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NLP入门——卷积语言模型的搭建、训练与预测

语言模型建模是针对句子建模,主要分为掩码语言模型和自回归语言模型。 我们从corpus中截取一句话作为例子,这句话是bpe分词后的句子: 1994 年 5 月 17 日 安全 理事会 第 33 77 次 会议 通过 掩码语言模型的主要机制是:例如将33 7…

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)

力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列) 文章目录 力扣爆刷第162天之TOP100五连刷76-80(最小路径和、最长公共前缀、最长连续序列)一、64. 最小路径和二、221. 最大正方形三、162. 寻找峰值…

OpenCV距离变换函数distanceTransform的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 distanceTransform是OpenCV库中的一个非常有用的函数,主要用于计算图像中每个像素到最近的背景(通常是非零像素到零像素&…

「C++系列」C++ 修饰符类型

文章目录 一、C 修饰符类型1. 访问修饰符(Access Modifiers)2. 存储类修饰符(Storage Class Specifiers)3. 类型修饰符(Type Modifiers)4. 函数修饰符 二、C 修饰符类型-案例1. 访问修饰符案例2. 存储类修饰…

JavaSE 面向对象程序设计进阶 IO流 字符输入输出流及底层原理

目录 字符输入流FileReader 空参的read方法 带参的read方法 字符输出流FileWriter 字符输入流底层原理 字符输出流底层原理 字符输入流FileReader 输入流 一次读一个字节 遇到中文时 一次读多个字节 输出流 底层会把数据按照指定的编码方式进行编码 在变成直接写到文件当…

Defensor 4.5:构建数据资产为中心的安全运营体系

5月31日“向星力”未来数据技术峰会上,星环科技重磅发布数据安全管理平台 Defensor 4.5版本。新版本引入了以数据资产为中心的数据安全运营体系,通过智能化大模型技术,帮助企业快速、精准地识别核心重要资产;建设全局的数据安全策…

昇思MindSpore学习笔记6-04计算机视觉--Shufflenet图像分类

摘要: 记录MindSpore AI框架使用ShuffleNet网络对CIFAR-10数据集进行分类的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建模型、模型训练、模型评估、模型测试等。 一、概念 1.ShuffleNet网络 旷视科技提出的CNN模型 应用在移动端 通…

【JavaSE】图书管理系统

目录 最终效果book包Book类BookList类 user包User类AdmiUser类(管理员类)NormalUser类(普通用户类) opeeration包IOperation接口FindOpertion类(查找操作)AddOpertion类(增加操作)De…

关于解决双屏幕鼠标移动方向问题

1.点开设置》系统》屏幕 2.分清屏幕标识,一般笔记本为1 3.点击要移动的屏幕,然后按住鼠标左键不方进行移动 感谢您的浏览,希望可以帮到您!

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式(Prompt-tuning,Prefix-tuning,P-tuning) ,主要是围绕NLP上的成果,具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

unity使用 MQTT复现plant simulate仿真

unity使用 MQTT复现plant simulate仿真 一、plant simulate端配置 1、plant simulate MQTT组件配置,该组件在类库的信息流类目下,端口不变,填写ip即可; 2、设备配置界面,在控件入口和出口处各挂一个脚本,当物料出入该设备时会分别触发执行这两个脚本,粘贴如下代码; E…

视频怎么压缩变小?最佳视频压缩器

即使在云存储和廉价硬盘空间时代,大视频文件使用起来仍然不方便。无论是存储、发送到电子邮件帐户还是刻录到 DVD,拥有最好的免费压缩软件可以确保您快速缩小文件大小,而不必担心视频质量下降。继续阅读以探索一些顶级最佳 免费视频压缩器选项…

小红书矩阵管理系统:多账号运营的智能解决方案

随着社交媒体的多元化发展,内容创作者和品牌商越来越需要一个能够高效管理多个账号的系统。小红书作为国内领先的生活分享平台,其矩阵管理系统应运而生,为用户带来了多账号发布、批量剪辑视频以及一键分发的便捷功能。本文将详细介绍小红书矩…

必看!微信小程序必备证书!

微信小程序必备SSL证书。在日益增长的数字经济中,微信小程序已成为商家与消费者之间重要的交互平台。由于其便捷性和广泛的用户基础,越来越多的企业选择通过小程序来提供服务。然而,在开发和部署微信小程序时,确保数据安全是一个不…

数据结构笔记之树常考性质6

总结: 具有n个结点的m叉树的最小高度可以通过计算并向下取整得到。高度最小时的情况是所有结点都有m个孩子。

计算机前端面试题总结-暑期实习(答案补充2)

目录 技术方面 二、js 1.js数据类型 1)值类型(基本类型) 2)引用数据类型(对象类型) ​编辑 2.判断数据类型是否为数组类型 1)Array.isArray() 2)instanceof操作符 3) Object.prototyp…

飞猪惹怒12306,一张火车票让第三方平台耍尽手段……

小柴已经记不清铁路12306是多少次发出提醒,似乎每一次出行高峰,都会提醒一次。 比如一再强调,购买加速包、付费成为会员就能优先出票,找朋友助力砍一刀,就能获得更高的出票概率……都是假的。‍‍ 因为,铁…

PostgreSQL 中如何处理数据的并发更新冲突解决?

文章目录 一、并发更新冲突的场景二、PostgreSQL 中的并发控制机制(一) 封锁机制(二) 事务隔离级别 三、并发更新冲突的解决方法(一) 重试机制(二) 使用乐观并发控制(三&…

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域,最近邻算法(Nearest Neighbors)是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…

打开excel时弹出stdole32.tlb

问题描述 打开excel时弹出stdole32.tlb 如下图: 解决方法 打开 Microsoft Excel 并收到关于 stdole32.tlb 的错误提示时,通常意味着与 Excel 相关的某个组件或类型库可能已损坏或不兼容。 stdole32.tlb 是一个用于存储自动化对象定义的类型库&#x…