Vulkan移植GpuImage(四)从D到O的滤镜
发布日期:2021-05-18 10:02:40 浏览次数:18 分类:精选文章

本文共 1929 字,大约阅读时间需要 6 分钟。

现将D到O的大部分滤镜用Vulkan的ComputeShader实现了,以下是其中一些特殊的说明:

高斯模糊(Blurlens)

  • GaussianBlurPosition:指定模糊区域进行高斯模糊,未采用GPUImage中的传统实现,而采用了类似GaussianSelectiveBlur的方式,通过混合原始图像与高斯模糊图像来实现,模糊半径和其他参数更加灵活控制。
  • SphereRefraction:环境映射实现。与GlassSphere类似,主要是球坐标系与UV坐标系的转换。初次测试时,发现圈外闪烁,后来发现未将圈外置零,withinSphere应指圈外即为有效范围。

半色调效果(Halftone)

  • 类似新闻打印的马赛克效果,基于PixellateFilter实现。主要将小矩形区域的UV坐标统一化后处理。

高通滤波(HighPass)

  • 实现了高通滤波,用于检测图像像素的变化。首先实现了LowPass滤镜,再通过比较当前帧与上一帧(通过VkSaveFrameLayer保存)以显示像素的变化。

Performance Optimization

  • Command Copy Performance: 直接使用vkCmdCopyImage时,表现为0.3ms-0.7ms。通过改用管线编码(bUserPipe = true)将时间降至0.2ms,找到性能下降的原因是内联函数未优化。
  • LowPass实现: LowPass具有两个输入节点,分别是上一帧和SaveFrameLayer提供的帧。LowPass运行前后会混合上一帧和当前帧,以去除 Dropout纹理,然后再储存结果到SaveFrameLayer中。
  • HighPass实现: 通过与LowPass的差异检测来显示像素变化。

直方图(Histogram)

  • 具体的实现方法有两种:直接回读到CPU计算,或者使用原子操作。最优方法是使用原子操作,通过256个线程组分别处理直方图中的颜色分布。实现中使用了reduce2的分段方式,但由于循环次数过多,改用原子操作的方式。

iOS Blur实现

  • 结合DownSampling、Saturation、GaussianBlur、LuminanceRange和UpSampling相结合,实现了类似iOS的高效滤镜效果。

高斯模糊实现

  • 采用了Kuwahara算法,类似于局部共享显存的方式进行优化。在1080P下,半径5需要3.3ms,半径10需要9.7ms。测试在Redmi 10X Pro手机上运行流畅,达到30帧。

###rama_optimization

  • 由于Kuwahara3x3算法特性,必须读取49个像素,性能较低。对此进行了多方面优化。

拉普拉斯算子(Laplacian)

  • 通过计算拉普拉斯算子找到边缘。由于UCO中的UBO存储方式,最好的方式是使用浮点数和std140的结构,避免CPU-GPU中的结构对齐问题。

Lookup表实现

  • 内置一个输入层,便于用户提供512x512x4的Lookup表。MissEtikate滤镜的实现可通过这个内置层完成。

中值滤波(Median)

  • 初期尝试通过局部共享显存进行优化,但效果不理想,最终移植了GPUImage中的3x3中值滤镜实现。

运动模糊(MotionBlur)

  • 实现简单,使用方向向量进行滤镜效果。

运动检测(MotionDetector)

  • 集成一个VkOutputLayer,输出类似GPUImage的统计数据,方便进一步处理。

MotionDetector实现

  • 层继承自VkLayer,内部包含LowPass和ReduceLayer。自定义一个.glsl脚本通过共享存储处理图像,输出运动统计图像。

NobleCornerDetection角点检测

  • 结合Harris和Noble算法检测角点,改进后效果较好。

Opening和Closing滤镜

  • 结合侵蚀和膨胀层实现Opening或Closing效果。

未实现的滤镜

  • FASTCornerDetection和JFAVoronoi等滤镜尚未实现,JFAVoronoi需要明确移植方法,暂时不展开。

Performance优化总结

  • 通过优化vkCmdCopyImage和internalFunction到管线编码(bUserPipe = true),将时间从0.3ms提升至0.2ms。
  • 企业校验总时间,发现LowPass、HighPass、Histogram、Kuwahara、Laplacian、MotionBlur等滤镜在不同帧率下的表现差异较大。

通过以上优化,滤镜效果与性能均得到了显著提升,为后续滤镜移植和性能优化奠定了基础。

上一篇:LINQPad,我的C#/.NET学习诀窍
下一篇:分解uber依赖注入库dig-使用篇

发表评论

最新留言

不错!
[***.144.177.141]2025年04月15日 05时06分49秒