gpt4 book ai didi

ios - 已解决 - 如何在 SceneKit 中使用 "HEVC with Alpha channel"视频?

转载 作者:行者123 更新时间:2023-12-01 16:13:22 28 4
gpt4 key购买 nike

At WWDC 2019, Apple announced that it was now handling HEVC with Alpha in iOS ,并声明它可以在 SceneKit 中使用。

我已经尝试了几个小时来实现这一目标,但没有任何运气。

我的目标是将视频用作 SCNNode 平面上的纹理,并使该平面在视频透明的地方透明。

我在 this xcode project 中使用了 Apple 提供的带有 Alpha 视频的 HEVC (带有 2 个木偶的视频)。

我正在使用 iOS 13.2 的真实设备上使用 XCode 11.2 进行开发。

我尝试了不同的方法。

方法 1. 使用 AVPlayer 作为我的 SCNNode Material 的漫反射 + 透明内容

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();

结果:视频是用黑色像素而不是透明像素渲染的。

方法二、在SKVideoNode中嵌入AVPlayer,然后在SKScene中嵌入SKVideoNode,将SKScene作为我的SCNNode Material 的漫反射+ Material 内容

这似乎是在 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: failed assertion `Fragment Function(FastSingle_FragFunc): missing sampler binding at index 0 for u_texture_sampler[0].'



注意:当我使用没有 Alpha channel 的常规 HEVC 视频时,我不会收到此错误。

方法 3. 使用 Material 着色器将 alpha 值从视频复制到 Material 的透明贴图。
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 相同的错误。

有没有人知道如何使这项工作?

更新:2020 年 1 月 7 日,星期二

我在 iOS 13.3 和 XCode 11.3 上尝试了不同的方法。
=> 同样的结果。

我刚刚向 Apple 报告了这个错误,感谢@mnuages 的链接。

更新:2020 年 3 月 24 日,星期二

此问题已在 iOS 13.4 的发布中得到解决。

具有透明度的 HEVC 视频会在 SceneKit 中直接被考虑在内,而不必弄乱 Material 的透明内容或着色器。

最佳答案

第一段代码应该可以工作(无需设置 transparent Material 属性)。如果您在 macOS SceneKit 游戏模板中进行以下更改,您将获得正确的结果,但是它不适用于 iOS SceneKit 游戏模板。

// retrieve the ship node
let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
let videoURL = Bundle.main.url(forResource: "puppets_with_alpha_hevc", withExtension: "mov", subdirectory: "art.scnassets");
let player = AVPlayer(url: videoURL! as URL)
let material = SCNMaterial()
material.diffuse.contents = player
player.play();
ship.enumerateHierarchy { (node, _) in
if let geometry = node.geometry {
geometry.materials = [material];
}
}

在这种情况下,人们可能想要 file a bug用于修复 iOS 版本。

关于ios - 已解决 - 如何在 SceneKit 中使用 "HEVC with Alpha channel"视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58720237/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com