【问题标题】:Distorting a view in iOS using Metal使用 Metal 扭曲 iOS 中的视图
【发布时间】:2018-06-27 02:17:55
【问题描述】:

问题:

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

我(可能不完整)的理解是我需要将视图捕获为纹理,将其移动到设备内存中,使用着色器对其进行处理,然后将其渲染回视图中。我目前停留在捕获视图的第一步。这个问题的范围仅取决于捕获纹理并将其放入 Metal 中,如果我遇到着色器问题,我将为此打开一个单独的问题。

如果有比降级到 GPU 级别更简单的方法,我愿意接受建议。

背景:

出于学习的目的,我正在尝试使用 Metal 重新创建 this short clip 中看到的涟漪效果(不使用视频中的 Qt 和 OpenGL)。据我了解,我需要一个顶点着色器和片段着色器。我想我可以通过一些实验将the repo 中的 openGL 着色器转换为 Metal。

Apple 为 iOS 提供了一个非常相似的动画,CATransition“rippleEffect”,所以这似乎是可能的,但他们使用的 API 是私有的,并且可能会导致您的应用被应用商店拒绝。

我也遇到过BCMeshTransformView,这似乎与我想要做的非常相似,但我没有运气尝试从源头收集它的工作原理。

我花了几个小时搜索文档,但总的来说,我是图形学的初学者,所以我可能没有在谷歌上搜索正确的术语。

【问题讨论】:

    标签: ios swift metal metalkit


    【解决方案1】:

    最简单的方法是使用CoreImage。 CI 提供了非常广泛的效果,可以很容易地应用于您的视图(这里是full list)。

    如果这些都不适合您,您实际上可以使用 GLSL(OpenGL 着色语言)编写 custom CIFilter,它将直接在 GPU 上运行。

    您可以通过抓取视图的UIImage 将给定的CIFilter 应用到UIView,将其转换为CIImage,运行您的过滤器,然后在屏幕上显示CIImage。我相信这比尝试使用 Metal 更容易,Metal 是一个低得多的 API。

    有关执行此操作的 CoreImage 代码示例,请参阅How to apply CIFilter to UIView?

    【讨论】:

    • 感谢您的回复。这种方法是否足够快以跟上视图的变化,还是假设视图在动画期间是静态的?例如,如果用户在表格视图上滑动并且我同时启动此效果,那么在应用此效果时是否能够显示表格滚动?我将视图渲染为 CGContext 的经验是,它的处理量相当大,不适合快速连续使用。
    • 是的,它对于任何类型的实时更新可能都不够高效(但我肯定会尝试一下)。在 macOS 上,您可以将 CIFilter 应用到您的支持 CALayer,但显然 iOS 不支持这...不幸的是,即使使用 Metal,我也不知道有一种非常快速的方法来捕获视图及其子视图转换为纹理。
    • @Erik 好奇它是否最终通过滚动表格视图变得足够快?
    • @Aaron,我从来没有在测试过广告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多