iOS10 + SceneKit:使用自定义着色器

时间:2016-09-17 01:59:50

标签: video opengl-es sprite-kit scenekit metal

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

  • SceneKit元素不支持AVPlayerLayer作为输入纹理(SO
  • 替代方案是:
    • 使用带有SKVideoNode的SpriteKit场景但是:
      • 自从iOS 10以来,只要涉及SpriteKit场景(SO),使用openGL渲染就会失败,我已经填满了雷达
      • 在使用Metal(SO)时,我无法弄清楚如何将制服传递到着色器修饰符。事情与openGL完美配合(在iOS 9上,当SpriteKit正在工作时)令人惊讶的是很少有文档在那里这一点。
      • 当SceneKit场景中涉及视频时,SCNProgram似乎失败(SO)没有视频的相同设置工作正常
    • 将视频输出转换为CGImage,将其传递给CALayer,并将此图层传递给SceneKit视频节点(不涉及SpriteKit)这是详细here,但视频不是可行的解决方案有点大,因为所有输出都被复制到图像,这是昂贵的..

我仍然不愿意离开SceneKit,因为它使用opengl / metal来处理很多讨厌的低级别事情,但我现在无法让事情发挥作用......

作为一个额外的坏消息,看起来SpriteKit在与Metal一起使用时会出现内存泄漏,并且它会使SceneView保持活动状态,因此所有父视图和附加到它们的所有内容......

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

1 个答案:

答案 0 :(得分:3)

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