【问题标题】:How can I render a SCNScene to a texture如何将 SCNScene 渲染到纹理
【发布时间】:2016-04-09 13:18:10
【问题描述】:

我需要将辅助 SCNScene 渲染到背景中的纹理 (NSImage) 中,以使该场景可用作“主要”SCNScene 中的纹理。我尝试将新的 SCNView(未添加到超级视图)与辅助场景及其 snapshot() 方法结合使用,但它要么仅部分绘制场景,要么根本不绘制场景。它实际上似乎有一个“时间问题”。如果我在将场景分配给 SCNView 和 snapshot() 调用之间添加睡眠,它会完全渲染。如果我让它们一个接一个地直接执行,那么场景只会被部分渲染。 我尝试了在类似文章中找到的各种其他建议(即 renderToImage 作为 SCNRenderer 的扩展),但它们都显示出相同的时间问题。 将次要场景渲染为 NSImage 的正确方法是什么(在显示主要场景时)?

【问题讨论】:

    标签: opengl scenekit


    【解决方案1】:

    我没有看到指向您正在谈论的其他建议的链接,但 SCNRenderer 应该能够在这里为您提供帮助 - renderAtTime: 方法允许您选择要渲染的场景时间戳,所以您应该能够使其使用与当前帧相同的时间戳。

    您还可以通过跳过 NSImage 步骤来提高性能 - 这需要从 GPU 读回数据以在 CPU 内存中创建图像,然后将其反馈给 GPU。可能您可以让您的 SCNRendererNSOpenGLLayerMTLTexture 为目标,然后您可以将其设置为材质的漫反射内容以直接重用渲染表面。

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

    【讨论】:

    • 为了好玩,我快速实现了 SK3DNode 方法:2 个旋转立方体,每个立方体有 3 个 SpriteKit 场景,每个场景播放著名的旋转船动画。他们保持同步就好了。两个注意事项:首先,将 SK3DNode 移动到 SpriteKit 场景的中心。其次,为嵌入式场景翻转 SceneKit 相机的 y 轴(我对我的操作方式并不满意,但它确实有效)。来源位于“嵌套场景”文件夹中的github.com/halmueller/ImmersiveInterfaces
    • 大概是因为纹理映射场景颠倒了,所以您正在翻转相机?这是纹理坐标和 SpriteKit 场景坐标之间差异的影响,因此在纹理映射级别处理它可能最有意义 - 使用 contentsTransform 和反转 y 的比例矩阵。
    • 是的!我进行了一些不同的变换和比例更改(在材质级别、SK3DNode 级别和相机),并设法实现了黑屏。我暂时先不管它,但欢迎 PR!
    • 我尝试了 SK3DNode,这正是我所需要的。非常感谢。我花了半天时间尝试渲染到 GL 上下文(部分渲染仍然存在时间问题),我所要做的就是将场景包装在 Sk3DNode 中。我只是从来没有想过在 SceneKit 方面进行搜索......再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多