Opengl 如何将SCNScene渲染到纹理

Opengl 如何将SCNScene渲染到纹理,opengl,scenekit,Opengl,Scenekit,我需要在背景中将次SCNScene渲染为纹理(NSImage),以使该场景作为“主”SCNScene中的纹理可用。我尝试将新的SCNView(未添加到superview)与次场景及其snapshot()方法结合使用,但它要么仅部分绘制场景,要么根本不绘制场景。它实际上似乎有一个“时间问题”。如果我在将场景指定给SCNView和snapshot()调用之间添加睡眠,它将完全渲染。如果我让它们在彼此之后直接执行,则场景仅部分渲染。 我尝试了在类似文章中找到的各种其他建议(即renderToImage

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

我看不到您正在谈论的其他方案的链接,但是
SCNRender
应该能够在这里帮助您-使用
rendertime:
方法可以选择要渲染的场景时间戳,因此您应该能够使用与当前帧相同的时间戳

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


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

为了好玩,我快速实现了SK3DNode方法:2个旋转立方体,每个立方体有3个SpriteKit场景,每个场景都播放著名的旋转船动画。它们很好地保持同步。两个注意事项:首先,将SK3DNode移动到SpriteKit场景的中心。其次,为嵌入场景翻转SceneKit相机的y轴(我对我的操作方式不感兴趣,但它可以工作)。源位于“嵌套场景”文件夹中。可能是因为纹理贴图的场景是颠倒的,所以您正在翻转摄影机?这是纹理坐标和SpriteKit场景坐标之间差异的结果,因此在纹理贴图级别处理它可能最有意义-使用
contentStrasForm
和反转y的比例矩阵。是的!我踢了几个不同的变换和比例变化(在材质级别、SK3DNode级别和摄影机级别),并设法实现了一个黑屏。我暂时不谈了,但欢迎公关!我试过SK3DNode,这正是我所需要的。非常感谢。我花了半天时间尝试渲染到GL上下文(部分渲染仍然存在时间问题),我所要做的就是将场景包装到Sk3DNode中。我只是从来没有想到在SceneKit方面进行搜索。。。再次感谢!