Metal 2:MetalKit(MTKView)和SceneKit互操作性

时间:2018-05-16 12:53:00

标签: scenekit metal metalkit

我正在使用MetalKit并拥有复杂的渲染管道。结果将呈现为MTKView。

现在我想将MTKView的内容提供给SCNScene并使用SCNCamera来执行像HDR这样的后期处理效果。

这怎么可能?

我不想要一般指示。如果可能,我想要特定的电话。

1 个答案:

答案 0 :(得分:2)

理想情况下,您应该将后期处理作为Metal渲染管道的一部分来执行。您建议的过程需要不必要的资源,因为您将在SceneKit中渲染3D平面以仅应用一些HDR效果。

尽管如此,您可以通过将Metal管道输出渲染到纹理然后将其应用到SceneKit中的平面来实现您想要的效果。

首先指定纹理:

plane.materials.first?.diffuse.contents = offscreenTexture

然后将SceneKit渲染覆盖到Metal渲染循环:

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
    doRender()
}

然后以纹理作为目标执行金属渲染,完成后渲染SceneKit场景:

func doRender() {
    //rendering to a MTLTexture, so the viewport is the size of this texture
    let viewport = CGRect(x: 0, y: 0, width: CGFloat(textureSizeX), height: CGFloat(textureSizeY))

    //write to offscreenTexture, clear the texture before rendering using green, store the result
    let renderPassDescriptor = MTLRenderPassDescriptor()
    renderPassDescriptor.colorAttachments[0].texture = offscreenTexture
    renderPassDescriptor.colorAttachments[0].loadAction = .clear
    renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 1, 0, 1.0); //green
    renderPassDescriptor.colorAttachments[0].storeAction = .store

    let commandBuffer = commandQueue.makeCommandBuffer()

    // reuse scene1 and the current point of view
    renderer.scene = scene1
    renderer.pointOfView = scnView1.pointOfView
    renderer.render(atTime: 0, viewport: viewport, commandBuffer: commandBuffer, passDescriptor: renderPassDescriptor)

    commandBuffer.commit()
}`

完整的示例项目:

https://github.com/lachlanhurst/SceneKitOffscreenRendering