在iOS中使用Metal扭曲视图

4

问题:

如何在Metal中捕捉要修改的视图?

我的(可能不完整的)理解是,我需要将视图捕捉为纹理,将其移动到设备内存中,在着色器上进行处理,然后将其呈现回视图。我目前被卡在了捕捉视图的第一步。该问题的范围仅限于捕捉纹理并将其传递到Metal,如果我遇到着色器问题,我将另开一个问题。

如果有比下降到GPU级别更容易的方法,我也可以接受建议。

背景:

为了学习,我正在尝试使用Metal(而非像视频中那样使用Qt和OpenGL)重新创建此短片中看到的涟漪效果。据我所知,我需要顶点着色器和片段着色器。我认为我可以通过一些实验将repo中的OpenGL着色器转换为Metal。

苹果提供了一个非常相似的iOS动画,即CATransition“rippleEffect”,因此似乎是可能的,但它们使用的API是私有的,可能会导致您的应用被拒绝上架应用商店。

我也遇到了BCMeshTransformView,它似乎与我想要做的非常相似,但我尝试从源代码中获取其工作方式时没有任何运气。

我已经花了几个小时搜索文档,但由于我在图形方面是初学者,所以可能没有用正确的术语进行搜索。

1个回答

2
实现这一点最简单的方法是使用CoreImage。CI提供了非常广泛的效果,可以相当容易地应用于您的视图(这里是完整列表)。
如果这些都不适合您,您实际上可以使用GLSL(OpenGL着色语言)编写自定义CIFilter,该滤镜将直接在GPU上运行。
您可以通过获取视图的UIImage,将其转换为CIImage,运行您的滤镜,然后在屏幕上显示CIImage,将给定的CIFilter应用于UIView。我认为这比尝试使用Metal更容易,因为它是一个远低于API的级别。
“要查看执行此操作的CoreImage代码示例,请参见如何将CIFilter应用于UIView?

1
感谢您详细的回复。这种方法是否足够快速以跟上视图的变化,或者它假定视图在动画期间是静态的?例如,如果用户在表视图上滑动,而我同时开始此效果,它能否在应用于表视图时显示表格滚动?我的经验是将视图渲染到CGContext中是一项相当繁重的处理工作,并不适合连续快速使用。 - Erik
是的,它可能不足以支持任何实时更新(但我肯定会尝试一下)。在 macOS 上,您可以将 CIFilter 应用于后备的 CALayer,但显然在 iOS 上不支持... 不幸的是,即使使用 Metal,我也不知道快速捕获视图及其子视图内容到纹理的方法。 - ldoogy
@Erik 请问使用滚动的TableView后速度够快了吗? - Aaron Ash
1
@Aaron,我从来没有测试过它。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接