gpt4 book ai didi

ios - 将离屏 SCNScene 渲染到 UIImage

转载 作者:可可西里 更新时间:2023-11-01 04:34:41 27 4
gpt4 key购买 nike

如何将 off-screen SCNScene 渲染到 UIImage 中?

我知道 SCNView 提供了一个 -snapshot 方法,但不幸的是,它不适用于离屏 View 。 similar question之前有人问过其中一个答案建议使用 glReadPixels 从 OpenGL 读取位图数据,但这种方法不适用于屏幕外场景。

我尝试使用 SCNRenderer 渲染到 GLKView 的上下文中,但没有成功。

最佳答案

带有 SCNRenderer 的 Swift 4:

您可以使用SCNRenderer 的快照方法轻松地将屏幕外的 SCNScene 渲染到 UIImage。

这里有一些注意事项,这使用了 Metal。我不知道设备/iOS 版本的截止点在哪里,但你需要更新的设备。您也无法在模拟器上运行它。

第 1 步 - 像往常一样设置场景:

// Set up your scene which won't be displayed
let hiddenScene = SCNScene()
[insert code to set up your nodes, cameras, and lights here]

第 2 步 - 设置 SCNRenderer——渲染器在模拟器上将为零:

// Set up the renderer -- this returns nil on simulator
let renderer = SCNRenderer(device: MTLCreateSystemDefaultDevice(), options: nil)
renderer!.scene = hiddenScene

第 3 步 - 将场景渲染到 UIImage:

// You can use zero for renderTime unless you are using animations,
// in which case, renderTime should be the current scene time.
let renderTime = TimeInterval(0)

// Output size
let size = CGSize(width:300, height: 150)

// Render the image
let image = renderer!.snapshot(atTime: renderTime, with: size,
antialiasingMode: SCNAntialiasingMode.multisampling4X)

如果您正在运行动画,则需要增加 renderTime 或将其设置为您要渲染的时间索引。例如,如果您想将帧渲染到场景中 4 秒,您可以将其设置为 4。这只会影响动画——它不会及时返回并向您显示场景的历史 View 。

例如,如果您正在使用 SCNNode.runAction 运行动画,您可能希望每 60 秒(0.16667 秒)保持递增 renderTime,这样无论何时您决定渲染,您都会得到一个更新的 renderTime:

var timer : Timer
var renderTime = TimeInterval(0)

timer = Timer.scheduledTimer(withTimeInterval: 0.016667, repeats: true, block: { (t) in
self?.renderTime += 0.016667
}
})

不过,使用 CADisplayLink 可能是更好的计时解决方案。

这是一个非常快速和肮脏的 implementation example .

关于ios - 将离屏 SCNScene 渲染到 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24589151/

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