2016-09-17 93 views
4

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

  • SceneKit元素不支持AVPlayerLayer作为输入纹理(SO
  • 替代方案:用SpriteKit场景与SKVideoNode但
      • 由于iOS的10,用OpenGL渲染,只要一个SpriteKit场景涉及失败(SO)我已经填补了雷达
      • 我无法弄清楚如何在使用Metal时将制服传递给着色器修改器(SO)事情与openGL完美配合(在iOS 9上,当SpriteKit工作时)在那里出乎意料的非常少的文档。
      • SCNProgram似乎只要一个视频参与SceneKit场景(SO)事情做工精细用相同的设置,但不视频
    • 转化的视频输出到CGImage,将它传递给一个CALayer的失败,并将此图层传递到SceneKit视频节点(不涉及SpriteKit)这是详细的here,但只要视频有点大,就不是一个可行的解决方案,因为所有的输出都被复制到图像上,并且这是昂贵的。

我仍然很不愿意摆脱SceneKit,因为它处理了很多opengl/metal的令人讨厌的低级别事情,但是我现在无法正常工作......

作为附加坏消息,它看起来像SpriteKit与Metal一起使用时存在内存泄漏,并且它保持活动的SceneView,因此所有父视图和附加到它们的所有东西...

你可以找到这个问题的复制here ,并且更简单一个here

+1

去年SpriteKit向前迈进了一步(一定是有所改进),并且大概有三个步骤(iOS 9)。苹果开始解决这些问题花了好几个月的时间。尽管有许多具体的,经常性的和相互矛盾的投诉,但他们并未公开承认问题。 – Confused

+1

iOS 10看起来像是SceneKit回到了几步,还有一次前进(PBR)。 SceneKit拥有1/20(或更少)的SpriteKit用户。所以他们可能需要一整年的时间来解决问题。说了这么多,在SceneKit上工作的两个人在这些论坛中都很活跃。 – Confused

+1

你知道吗?如果问题来自SceneKit或SpriteKit,我怎么能有一个想法? – Guig

回答

3

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

+0

这不会提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/15212577) –

+1

我是作家。把它放在这里可以提供更多的可见性,这种替代方法虽然不是对问题的直接回答,但却解决了仅使用SceneKit解决带着色器的3D渲染原始问题的问题。我没有接受这个答案,也不会这样做。当有人提供完整的答案时,我会删除这个迄今为止最好的答案。如果你有更好的答案,请继续! – Guig

+0

@Guig看起来像一个伟大的图书馆 - 忽略堆栈溢出警察,他们是绝望的。 – Jordan