扫描特效 (ScanEffect)

大家都知道扫描仪的工作原理,对吧? 对... 😳?

它有点复杂,但本质上,过程是:

  1. 你将内容放在扫描区域上
  2. 扫描传感器逐行扫描该区域
  3. 每条扫描的线都会存储在图像输出中

就是这样。很简单 🤓

这个特效是如何工作的?

如果在扫描进行时移动内容,会发生有趣的事情。 scanEffect 扩展允许你创建这样的效果。

这是一个 可能的实现

通常,图像处理由 GPU 处理。 Shader 函数的任务是处理 scanArea.height * scanArea.width 个像素。 在 shader 内部实现整个效果是很常见的,但是,如果你想注入一些交互性,或者以任何方式从外部影响 shader 的输出,你必须能够在 CPU 上也做一些工作。 scanEffect 通过公开 ScanEffectContentDisplacementCalculator 来实现这一点,它允许你计算每帧扫描区域每行的内容位移。 所以过程是:

  1. 你将 sceneEffect modifier 添加到你的 View
  2. 对于扫描区域的每一行,该效果基于提供的 ScanEffectContentDisplacementCalculator 计算内容位移
  3. 内容在扫描区域中被位移,并用于提供输出图像中的一行内容。

因此,渲染一帧时,会在 CPU 上发生 scanArea.height 次对 displacedContentPosition.calculate 的调用。 很多吗? 没那么多? 视情况而定。 如果你想渲染动画,它可能会变得非常繁重,所以要小心!

如何集成它?

作为 Swift Package 使用。

为什么?

我主要为了自己制作它,作为我最近的 SwiftUI + Metal 研究的练习。

随意使用它(嗯,它不一定是生产就绪的 - 这取决于用例),随意贡献(修复问题,分享想法),随时在 @czajnikowski 上联系我 👋