At WWDC 2019,Apple announced that it was now handling HEVC with Alpha in iOS,并声明可以在SceneKit中使用它。
我已经尝试了好几个小时才能做到这一点,但没有任何运气。
我的目标是将视频用作Scnnode平面上的纹理,并使该平面在视频透明的地方透明。
我将HEVC与Apple在this xcode project中提供的Alpha视频一起使用(带有2个木偶的视频)。
我正在使用iOS 13.2的真实设备上的XCode 11.2开发。
我尝试了不同的方法。
方法1.使用AVPlayer作为我的Scnnode材质的漫反射和透明内容
let videoURL = Bundle.main.url(forResource: “puppets_with_alpha_hevc“,withExtension: "mov",subdirectory: "Assets.scnassets");
let player = AVPlayer(url: videoURL! as URL)
let material = SCnmaterial()
material.diffuse.contents = player
material.transparent.contents = player
plane?.geometry?.materials = [material];
player.play();
结果::视频是用黑色像素而不是透明像素呈现的。
方法2。将AVPlayer嵌入SKVideonode中,然后将SKVideonode嵌入SKScene中,并使用SKScene作为我的Scnnode材质的漫反射+材质内容
这似乎是在SceneKit中将视频显示为素材的一种常见方法。另外,在the example provided by apple中,有关如何渲染“带有alpha的HEVC视频”,他们使用了SKVideonode(但不在SceneKit上下文中使用)。
let videonode = SKVideonode(avPlayer: player)
let spritescene = SKScene(size: CGSize(width: 360,height: 480))
let spriteKitScene = SKScene(size: CGSize(width: 360.0 / 2.0,height: 480.0 / 2.0))
spriteKitScene.scaleMode = .aspectFit
videonode.position = CGPoint(x: spriteKitScene.size.width / 2.0,y: spriteKitScene.size.height / 2.0)
videonode.size = spriteKitScene.size
spriteKitScene.addChild(videonode)
let material = SCnmaterial()
material.diffuse.contents = spriteKitScene
material.transparent.contents = spriteKitScene
plane?.geometry?.materials = [material];
结果:发生此崩溃:
validateFunctionArguments:3577:失败的断言片段 函数(FastSingle_FragFunc):缺少索引为0的采样器绑定 u_texture_sampler [0]。'
注意::当我使用不带Alpha通道的常规HEVC视频时,不会出现此错误。
方法3.使用材质着色器将Alpha值从视频复制到材质的透明贴图。
let material = SCnmaterial()
material.diffuse.contents = player
material.shaderModifiers = [
SCNShaderModifierEntryPoint.surface : "_surface.transparent.a = _surface.diffuse.a;"
];
plane?.geometry?.materials = [material];
结果::视频以黑色像素而不是透明像素呈现。 Alpha信息似乎不在 _surface.diffuse.a
中方法4.将着色器与SKScene而不是AVPlayer一起使用
结果:与方法2相同的错误。
有人知道如何进行这项工作吗?