如何将 SCNScene 渲染到纹理
How can I render a SCNScene to a texture
我需要将辅助 SCNScene 渲染到背景中的纹理 (NSImage) 中,以便将该场景用作 "main" SCNScene 中的纹理。我尝试将新的 SCNView(未添加到超级视图)与辅助场景及其 snapshot() 方法结合使用,但它要么仅部分绘制场景,要么根本不绘制场景。它实际上似乎有一个"timing issue"。如果我在将场景分配给 SCNView 和调用 snapshot() 之间添加一个睡眠,它就会完全呈现。如果我让它们直接在彼此之后执行,则场景只会部分渲染。
我尝试了在类似文章中找到的各种其他建议(即 renderToImage 作为 SCNRenderer 的扩展),但它们都显示出相同的时间问题。
将次要场景渲染到 NSImage 中的正确方法是什么(显示主要场景时)?
我没有看到您正在谈论的其他提案的链接,但是 SCNRenderer
应该可以在这里帮助您 — renderAtTime:
方法可以让您选择场景时间戳渲染,所以你应该能够使用与当前帧相同的时间戳。
您还可以通过跳过 NSImage
步骤来提高性能——这需要从 GPU 读回数据以在 CPU 内存中创建图像,然后将其反馈给 GPU .也许您可以让 SCNRenderer
以 NSOpenGLLayer
或 MTLTexture
为目标,然后您可以将其设置为 material 的漫反射内容以直接重用渲染表面。
最后,您可以使用 SK3DNode
在 SpriteKit (2D) 场景中显示 SceneKit (3D) 内容...您可以通过设置将 SKScene
纹理映射到 SceneKit 3D 对象它作为 material 属性 的内容。我不确定这将如何解决您的动画同步问题,但它至少应该将所有内容保持在同一渲染表面。
我需要将辅助 SCNScene 渲染到背景中的纹理 (NSImage) 中,以便将该场景用作 "main" SCNScene 中的纹理。我尝试将新的 SCNView(未添加到超级视图)与辅助场景及其 snapshot() 方法结合使用,但它要么仅部分绘制场景,要么根本不绘制场景。它实际上似乎有一个"timing issue"。如果我在将场景分配给 SCNView 和调用 snapshot() 之间添加一个睡眠,它就会完全呈现。如果我让它们直接在彼此之后执行,则场景只会部分渲染。 我尝试了在类似文章中找到的各种其他建议(即 renderToImage 作为 SCNRenderer 的扩展),但它们都显示出相同的时间问题。 将次要场景渲染到 NSImage 中的正确方法是什么(显示主要场景时)?
我没有看到您正在谈论的其他提案的链接,但是 SCNRenderer
应该可以在这里帮助您 — renderAtTime:
方法可以让您选择场景时间戳渲染,所以你应该能够使用与当前帧相同的时间戳。
您还可以通过跳过 NSImage
步骤来提高性能——这需要从 GPU 读回数据以在 CPU 内存中创建图像,然后将其反馈给 GPU .也许您可以让 SCNRenderer
以 NSOpenGLLayer
或 MTLTexture
为目标,然后您可以将其设置为 material 的漫反射内容以直接重用渲染表面。
最后,您可以使用 SK3DNode
在 SpriteKit (2D) 场景中显示 SceneKit (3D) 内容...您可以通过设置将 SKScene
纹理映射到 SceneKit 3D 对象它作为 material 属性 的内容。我不确定这将如何解决您的动画同步问题,但它至少应该将所有内容保持在同一渲染表面。