iOS10 + SceneKit:使用自定义着色器渲染视频

Posted

技术标签:

【中文标题】iOS10 + SceneKit:使用自定义着色器渲染视频【英文标题】:iOS10 + SceneKit: render a video with custom shader 【发布时间】:2017-01-25 07:34:13 【问题描述】:

在使用自定义着色器时,如何在 SceneKit 的节点上将视频渲染为漫反射纹理?这听起来很简单,但是:

SceneKit 元素不支持 AVPlayerLayer 作为输入纹理 (SO) 替代方案是: 使用带有 SKVideoNode 的 SpriteKit 场景,但是: 从 ios 10 开始,只要涉及 SpriteKit 场景,使用 openGL 进行渲染就会失败 (SO) 我已经做好准备了 我不知道在使用 Metal 时如何将制服传递给着色器修改器 (SO) 事情与 openGL 完美配合(在 iOS 9 上,当 SpriteKit 工作时) 令人惊讶的是,关于这方面的文档很少。 SceneKit 场景中涉及视频时,SCNProgram 似乎立即失败 (SO) 在没有视频的情况下使用相同的设置一切正常 将视频输出转换为 CGImage,将其传递给 CALayer,并将该层传递给 SceneKit 视频节点(不涉及 SpriteKit)这是详细的here,但一旦视频是有点大,因为所有输出都被复制到图像中,这很昂贵..

我仍然不太愿意退出 SceneKit,因为它使用 opengl/metal 处理了很多烦人的低级事情,但我现在无法让事情正常工作......

另外一个坏消息是,SpriteKit 在与 Metal 一起使用时似乎存在内存泄漏,并且它使 SceneView 保持活动状态,因此所有父视图以及附加到它们的所有内容......

您可以找到此问题的复制品here,以及更简单的here:

【问题讨论】:

去年 SpriteKit 向前迈进了一步(一定是有所改进),大约向后退了三步(iOS 9)。苹果花了好几个月才开始解决这些问题。尽管有许多具体的、反复出现的和匹配的投诉,但他们从未公开承认这些问题。 iOS 10 看起来该轮到 SceneKit 后退几步了,然后向前一步 (PBR)。 SceneKit 拥有 SpriteKit 用户的 1/20(或更少)。所以他们可能需要一整年的时间来解决问题。话虽如此,在 SceneKit 上工作的两个人都活跃在这些论坛中。 你知道我怎么知道问题是来自 SceneKit 还是 SpriteKit? 并非如此,这在很大程度上取决于您如何做事,以及实现这一目标的正确方法有多模糊。 Sprite Kit 的 Apple 文档很差。 SceneKit 的文档很糟糕。 这没有直接的帮助,但是……如果你喜欢它,再提交一次,我们就可以开始记录我们学到的关于 SceneKit 的任何东西。我不是 SO.Docs 的忠实信徒,但这是一个可能适合的用例:***.com/documentation/scenekit/commit 【参考方案1】:

无法解决这个问题,我编写了自己的库来模仿 SceneKit 的一些功能:https://github.com/team-pie/DDDKit

【讨论】:

这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review 我是作者。把它放在这里提供了一个替代方案的更多可见性,虽然它不是问题的直接答案,但解决了仅使用 SceneKit 解决使用着色器进行 3D 渲染的原始问题的人的问题。我不接受这个答案,也不会这样做。当有人提供完整的答案时,我会删除这个迄今为止最好的答案。如果您有更好的答案,请继续! @Guig 看起来像一个很棒的图书馆 - 忽略 Stack Overflow 警察,他们没有希望。 它可能需要一点点精神。如果您遇到问题,请告诉我!

以上是关于iOS10 + SceneKit:使用自定义着色器渲染视频的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 在着色器修改器中访问目标颜色以进行混合

SCNProgram - 如何将“mat4”类型的制服传递给自定义着色器?

iOS 14 解决方法中的 SceneKit Metal 着色器编译性能错误

将 Metal 缓冲区传递给 SceneKit 着色器

GLSL + Scenekit:不允许函数定义

带有 SceneKit SCNProgram 的金属着色器