如何将 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 .也许您可以让 SCNRendererNSOpenGLLayerMTLTexture 为目标,然后您可以将其设置为 material 的漫反射内容以直接重用渲染表面。

最后,您可以使用 SK3DNode 在 SpriteKit (2D) 场景中显示 SceneKit (3D) 内容...您可以通过设置将 SKScene 纹理映射到 SceneKit 3D 对象它作为 material 属性 的内容。我不确定这将如何解决您的动画同步问题,但它至少应该将所有内容保持在同一渲染表面。