Я хочу визуализировать свою текстуру и получить ее результат, чтобы я мог повторно использовать текстуру для следующего шага рендеринга. Но я не знаю, как получить результат рендеринга.
это код, который я использую для рендеринга:
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()
, оно будет таким же, как до рендеринга.