Совместимость с Metal 2: MetalKit (MTKView) и SceneKit - PullRequest
0 голосов
/ 16 мая 2018

Я использую MetalKit и у меня сложный конвейер рендеринга.Результаты отображаются в MTKView.

Теперь я хотел бы передать содержимое MTKView в SCNScene и использовать SCNCamera для выполнения эффектов постобработки, таких как HDR.

Как этовозможно?

Я не хочу общих указаний.Я хочу конкретные звонки, если это возможно.

1 Ответ

0 голосов
/ 17 мая 2018

В идеале вы должны выполнять постобработку как часть конвейера рендеринга металла. Предлагаемая процедура требует ненужных ресурсов, поскольку вы будете визуализировать 2D-плоскость в 3D в SceneKit, чтобы применить некоторые эффекты 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

...