【发布时间】:2017-03-10 20:00:43
【问题描述】:
我的 SCNView 使用 Metal 作为渲染 API,我想知道是否有一种方法可以将渲染的场景作为 MTLTexture 来获取,而无需使用单独的SCNRenderer?当我尝试通过 SCNView 显示场景并通过 SCNRenderer 将屏幕外场景重新渲染到 MTLTexture 时,性能下降(我正在尝试获取每一帧的输出)。
SCNView 允许我访问它使用的 MTLDevice、MTLRenderCommandEncoder 和 MTLCommandQueue,但不能访问为了获得 MTLTexture(通过renderPassDescriptor.colorAttachments[0].texture)
我尝试过的一些替代方法是尝试使用 SCNView.snapshot() 获取 UIImage 并对其进行转换,但性能更差。
【问题讨论】:
-
根据这里所说的developer.apple.com/reference/metal/…,您需要创建一个新的 MTLRenderPassDescriptor,获取 MTLRenderPassAttachmentDescriptor 并将 MTLTexture 设置为您的渲染目标。鉴于您有可用的东西,例如 MTLRenderCommandEncoder,似乎他们让您可以绘制,而不是从中获取缓冲区。如果您可以创建自己的 MTLRenderPassDescriptor 并将其提供给 SCNView,您可以设置渲染目标。
-
哦,看起来您可以使用 SCNRenderer developer.apple.com/reference/scenekit/scnrenderer 设置您自己的 MTLRenderPassDescriptor,这可能就是您需要做的。
-
设置 SCNRenderer 会导致它重新渲染场景(因为它在自己的渲染周期中),从而导致性能下降。我希望只从已经渲染的场景中获取底层纹理(假设 SCNView 渲染成一个,这似乎是这种情况,因为它使用 CAMetalLayer 作为视图的支持层)。
-
你是在做镜子吗?
-
我在想这将是一个不反射的非常奇怪的镜子,纳米!不过我很好奇你是如何解决这个问题的。