Ama*_*lin 6 ios scenekit swift
在 WWDC 2019 上,苹果宣布现在正在 iOS 中使用 Alpha 处理 HEVC,并声明它可以在 SceneKit 中使用。
\n\n我已经尝试了几个小时来实现这一目标,但没有任何运气。
\n\n我的目标是使用视频作为 SCNNode 平面上的纹理,并在视频透明的地方使该平面透明。
\n\n我在这个 xcode 项目中使用 Apple 提供的带有 Alpha 视频的 HEVC (带有 2 个木偶的视频)。
\n\n我正在使用 iOS 13.2 的真实设备上使用 XCode 11.2 进行开发。
\n\n我尝试了不同的方法。
\n\nlet videoURL = Bundle.main.url(forResource: \xe2\x80\x9cpuppets_with_alpha_hevc\xe2\x80\x9c, withExtension: "mov", subdirectory: "Assets.scnassets");\nlet player = AVPlayer(url: videoURL! as URL)\nlet material = SCNMaterial()\nmaterial.diffuse.contents = player\nmaterial.transparent.contents = player\nplane?.geometry?.materials = [material];\nplayer.play();\nRun Code Online (Sandbox Code Playgroud)\n\n结果:视频用黑色像素而不是透明像素渲染。
\n\n这似乎是在 SceneKit 中将视频显示为素材的常见方式。此外,在苹果提供的有关如何使用 alpha\xe2\x80\x9d 渲染 \xe2\x80\x9cHEVC 视频的示例中,他们使用 SKVideoNode (但不在 SceneKit 上下文中)。
\n\nlet videoNode = SKVideoNode(avPlayer: player)\nlet spritescene = SKScene(size: CGSize(width: 360, height: 480))\nlet spriteKitScene = SKScene(size: CGSize(width: 360.0 / 2.0, height: 480.0 / 2.0))\nspriteKitScene.scaleMode = .aspectFit\nvideoNode.position = CGPoint(x: spriteKitScene.size.width / 2.0, y: spriteKitScene.size.height / 2.0)\nvideoNode.size = spriteKitScene.size\nspriteKitScene.addChild(videoNode)\nlet material = SCNMaterial()\nmaterial.diffuse.contents = spriteKitScene\nmaterial.transparent.contents = spriteKitScene\nplane?.geometry?.materials = [material];\nRun Code Online (Sandbox Code Playgroud)\n\n结果:出现此崩溃:
\n\n\n\n\nvalidateFunctionArguments:3577: 断言失败 `Fragment\n Function(FastSingle_FragFunc): 缺少 u_texture_sampler[0] 在索引 0 处的采样器绑定。\'
\n
注意:当我使用没有 Alpha 通道的常规 HEVC 视频时,我不会\xe2\x80\x99 出现此错误。
\n\nlet material = SCNMaterial()\nmaterial.diffuse.contents = player\nmaterial.shaderModifiers = [\n SCNShaderModifierEntryPoint.surface : "_surface.transparent.a = _surface.diffuse.a;"\n];\nplane?.geometry?.materials = [material];\nRun Code Online (Sandbox Code Playgroud)\n\n结果:视频用黑色像素而不是透明像素渲染。alpha信息似乎不在_surface.diffuse.a中
\n\n结果 :与方法 2 的错误相同。
\n\n有谁知道如何进行这项工作?
\n\n我在 iOS 13.3 和 XCode 11.3 上尝试了不同的方法。\n=> 相同的结果。
\n\n我刚刚向 Apple 报告了该错误,感谢@mnuages 提供的链接。
\n\niOS 13.4 的发布解决了该问题。
\n\nSceneKit 会立即考虑具有透明度的 HEVC 视频,而无需干扰材质的透明内容或着色器。
\n第一个代码片段应该可以工作(无需设置transparent材质属性)。如果您在 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];
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,人们可能想要提交一个错误来修复 iOS 版本。
| 归档时间: |
|
| 查看次数: |
2310 次 |
| 最近记录: |