Как получить рендеринг текстуры без использования CAMetalDrawable? - PullRequest
1 голос
/ 03 мая 2020

Я хочу визуализировать свою текстуру и получить ее результат, чтобы я мог повторно использовать текстуру для следующего шага рендеринга. Но я не знаю, как получить результат рендеринга.

это код, который я использую для рендеринга:

var destinationTexture: MTLTexture?

func update(texture: MTLTexture) {
        // Create render targets for offscreen camera image and scene render
        let width = texture.width
        let height = texture.height

        let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: texture.pixelFormat,
                                                                         width: width,
                                                                         height: height,
                                                                         mipmapped: false)
        textureDescriptor.usage = [.renderTarget, .shaderRead, .shaderWrite]

        guard let newTexture = destinationTexture ??  texture.makeTextureView(pixelFormat: texture.pixelFormat) else {
            fatalError("Could not create texture of size: (\(width), \(height))")
        }

        _ = inFlightSemaphore.wait(timeout: DispatchTime.distantFuture)

        if let commandBuffer = commandQueue.makeCommandBuffer() {
            updateBufferStates()
            updateState()

            let vertexBuffer = sharedMetalRenderingDevice.device.makeBuffer(bytes: kImagePlaneVertexData,
            length: kImagePlaneVertexData.count * MemoryLayout<Float>.size, options: [])!

            let renderPass = MTLRenderPassDescriptor()
            renderPass.colorAttachments[0].texture = newTexture
            renderPass.colorAttachments[0].clearColor = MTLClearColorMake(1, 0, 0, 1)
            renderPass.colorAttachments[0].storeAction = .store
            renderPass.colorAttachments[0].loadAction = .clear

            guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPass) else {
                fatalError("Could not create render encoder")
            }
            renderEncoder.setRenderPipelineState(strip.renderPipelineState)

            // Setup plane vertex buffers
            renderEncoder.setVertexBuffer(imagePlaneVertexBuffer, offset: 0, index: 0)
            renderEncoder.setVertexBuffer(scenePlaneVertexBuffer, offset: 0, index: 1)

            renderEncoder.setFragmentBuffer(sharedUniformBuffer, offset: sharedUniformBufferOffset, index: Int(kBufferIndexSharedUniforms.rawValue))

            // ... set pipelane state and so on

            renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4)
            renderEncoder.endEncoding()

        commandBuffer.addCompletedHandler { _ in

                let updatedTexture = renderPass.colorAttachments[0].texture
                self.destinationTexture = updatedTexture
            }

            commandBuffer.commit()
        }
        inFlightSemaphore.signal()
    }

Я делаю все, что мне нужно с texture во фрагменте но я не понимаю, как получить окончательный MTLTexture объект в ядре swift? Если я пытаюсь получить содержимое texture после commandBuffer.commit(), оно будет таким же, как до рендеринга.

1 Ответ

0 голосов
/ 03 мая 2020

Ваша реализация неверна, вы должны инициализировать текстуру фреймбуфера в начале приложения и повторно использовать функцию обновления.

...