Update
(注:本README文档旨在快速了解本项目,完整的项目功能说明书、PPT、承诺书和代码见下)
./doc/
./code/
Xcomponent配合Opengl Compute Shader构造积分图,实现O(1)渐变模糊
渐变模糊是指图像的模糊程度沿着某个方向变化,从无到有,从强到弱。OpenHarmony开源操作系统为UI组件提供了渐变模糊接口,其调用了图形子系统的 graphic_2d中的渐变模糊算法。由于渐变模糊对GPU算力要求高,而移动端上的GPU性能通常较弱,我们需要设计高效算法,到达效果与性能的平衡。
graphic_2d
赛题要求性能较OpenHarmony已有算法优化50%以上,需要满足移动端设备的满帧运行。
渐变模糊效果示例图:
Skia
Skia Shader Language
OpenGL Compute Shader
Parallel Prefix Sum(Scan)
我们分析了OpenHarmony现有的两种渐变模糊算法:
提出了两种优化方案:
初赛方案
决赛方案:
oh4.1使用了skia内置的优化过的Gaussian Blur,并使用LinearGradientMask修改模糊图像的alpha通道,最后与原图blend,从而实现渐变效果。由于赛题的要求是性能提升50%,我们思路是使用其他cost更低的模糊算法,同时尽可能保持模糊质量。
我们结合oh4.1的mask思路,修改系统源码,实现DualGrainyGradientBlur和DualKawaseGradientBlur两种算法。并对渐变模糊中存在的计算浪费问题进行了优化。
方案一需要修改系统源码,所以使用了开源的RK3568进行测试,RK3568的帧率上限为69。测试环境:
测试结果如下:
我们的算法提升了帧率,同时也兼顾到了模糊质量。
图像质量指标:
MaskLinearGradientBlur是基于高斯模糊,而高斯模糊是高质量模糊的代表。因此,我们将MaskLinearGradientBlur产生的图像作为reference,分别计算DualKawaseGradientBlur和DualGrainyGradientBlur的PSNR和SSIM指标(指标都是越高越好)。
Kawase和Grainy的SSIM指标分别为0.998和0.921,这说明模糊质量很接近MaskLinearGradientBlur的效果。
通过网盘分享的文件:images.7z 链接: https://pan.baidu.com/s/1B-HskuVJScA--2h-eOB_eg?pwd=fmdt 提取码: fmdt
由于我们修改了前端接口,请参考 ./code/README.md进行测试 –
./code/README.md
nativeblur
我们开发了一个XComponent组件 nativeblur,它使用OpenGL Compute Shader构造积分图实现渐变模糊效果。
该组件的使用方式与原生的 LinearGradientBlur接口类似。
LinearGradientBlur
我们使用XComponent提供的native window创建EGL/OpenGL环境。使用OpenGL ES Compute Shader并行计算积分图SAT,并基于SAT实现渐变模糊,模糊半径无关 O(1)复杂度。开发者手机满帧运行,较OH4.1性能提升135%。
此外我们还对SAT并行算法优化:
积分图 Summed-area_table,其实是二维前缀和 2D Prefix Sum 在图像领域的特指。假设原图像为 $T(x,y)$ ,则积分图 $S(x,y)$ 为:
2D Prefix Sum
为什么要使用积分图?主要总结为以下三点:
n
1D Prefix Sum
测试环境:
[[0, 0], [0.2, 0.5~0.9], [1, 1]]
GradientDirection.Top
渲染分辨率1080x2184,纹理尺寸1024x1024, 模糊半径 120, 数据类型为float32,3 BoxBlur。
初赛方案:
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
渐变模糊效果技术
(注:本README文档旨在快速了解本项目,完整的项目功能说明书、PPT、承诺书和代码见下)
./doc/
./code/
决赛作品更新说明
Xcomponent配合Opengl Compute Shader构造积分图,实现O(1)渐变模糊
。📚目录
项目介绍
渐变模糊是指图像的模糊程度沿着某个方向变化,从无到有,从强到弱。OpenHarmony开源操作系统为UI组件提供了渐变模糊接口,其调用了图形子系统的
graphic_2d
中的渐变模糊算法。由于渐变模糊对GPU算力要求高,而移动端上的GPU性能通常较弱,我们需要设计高效算法,到达效果与性能的平衡。赛题要求性能较OpenHarmony已有算法优化50%以上,需要满足移动端设备的满帧运行。
渐变模糊效果示例图:
项目难点
Skia
图形引擎的使用、Skia Shader Language
编写。OpenGL Compute Shader
编写、Parallel Prefix Sum(Scan)
特定GPU优化。项目亮点
我们分析了OpenHarmony现有的两种渐变模糊算法:
提出了两种优化方案:
初赛方案
决赛方案:
初赛方案 X-DualGradientBlur
1.1算法设计
oh4.1使用了skia内置的优化过的Gaussian Blur,并使用LinearGradientMask修改模糊图像的alpha通道,最后与原图blend,从而实现渐变效果。由于赛题的要求是性能提升50%,我们思路是使用其他cost更低的模糊算法,同时尽可能保持模糊质量。
我们结合oh4.1的mask思路,修改系统源码,实现DualGrainyGradientBlur和DualKawaseGradientBlur两种算法。并对渐变模糊中存在的计算浪费问题进行了优化。
1.2帧率测试
方案一需要修改系统源码,所以使用了开源的RK3568进行测试,RK3568的帧率上限为69。测试环境:
测试结果如下:
1.3图像质量测试
我们的算法提升了帧率,同时也兼顾到了模糊质量。
图像质量指标:
MaskLinearGradientBlur是基于高斯模糊,而高斯模糊是高质量模糊的代表。因此,我们将MaskLinearGradientBlur产生的图像作为reference,分别计算DualKawaseGradientBlur和DualGrainyGradientBlur的PSNR和SSIM指标(指标都是越高越好)。
Kawase和Grainy的SSIM指标分别为0.998和0.921,这说明模糊质量很接近MaskLinearGradientBlur的效果。
1.4系统镜像
通过网盘分享的文件:images.7z 链接: https://pan.baidu.com/s/1B-HskuVJScA--2h-eOB_eg?pwd=fmdt 提取码: fmdt
决赛方案 X-SAT
2.1渐变模糊Xcomponent组件
nativeblur
我们开发了一个XComponent组件
nativeblur
,它使用OpenGL Compute Shader构造积分图实现渐变模糊效果。该组件的使用方式与原生的
LinearGradientBlur
接口类似。2.2算法设计
我们使用XComponent提供的native window创建EGL/OpenGL环境。使用OpenGL ES Compute Shader并行计算积分图SAT,并基于SAT实现渐变模糊,模糊半径无关 O(1)复杂度。开发者手机满帧运行,较OH4.1性能提升135%。
此外我们还对SAT并行算法优化:
积分图/2D前缀和
积分图 Summed-area_table,其实是二维前缀和
S(x,y)=x′≤xy′≤y∑T(x′,y′)2D Prefix Sum
在图像领域的特指。假设原图像为 $T(x,y)$ ,则积分图 $S(x,y)$ 为:为什么要使用积分图?主要总结为以下三点:
n
,每个像素都只需要4次采样,$O(1)$复杂度。而传统均值模糊/高斯模糊(使用线性分解),时间复杂度为$O(n)$。1D Prefix Sum
,再对每一列做1D Prefix Sum
。2.3帧率测试
测试环境:
[[0, 0], [0.2, 0.5~0.9], [1, 1]]
GradientDirection.Top
不实时更新积分图
实时更新积分图
渲染分辨率1080x2184,纹理尺寸1024x1024, 模糊半径 120, 数据类型为float32,3 BoxBlur。
演示视频
初赛方案:
决赛方案: