【问题标题】:Render image in mtlView with Metal Api使用 Metal Api 在 mtlView 中渲染图像
【发布时间】:2025-12-12 10:25:02
【问题描述】:

帮我弄清楚metal api,我想通过mtlView渲染正常的图片,但它不适合我,这是我的代码,我做错了什么?接下来我想用UISlider和CIColorControls来改变这张图片60fps的对比度,请解释一下。

import MetalKit

class ViewController: UIViewController, MTKViewDelegate {

    let device = MTLCreateSystemDefaultDevice()
    let colorSpace = CGColorSpaceCreateDeviceRGB()

    lazy var commandQueue: MTLCommandQueue = {
        [unowned self] in

        return self.device!.makeCommandQueue()
        }()!

    lazy var ciContext: CIContext = {
        [unowned self] in

        return CIContext(mtlDevice: self.device!)
        }()

    @IBOutlet weak var mtlView: MTKView!
    let filter = CIFilter(name: "CIPhotoEffectProcess" )
    let contrastFilter = CIFilter(name: "CIColorControls")
    var image = CIImage()

    @IBOutlet weak var slider: UISlider!


    override func viewDidLoad() {
        super.viewDidLoad()
        mtlView.delegate = self

        let img = UIImage(named: "picture")
        let ciImage = CIImage(image: img!)
        image = ciImage!
    }


    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {

    }

    func draw(in view: MTKView) {
        guard let targetTexture = view.currentDrawable?.texture else {
            return
        }

        let commandBuffer = commandQueue.makeCommandBuffer()

        let bounds = CGRect(origin: CGPoint.zero, size: view.drawableSize)

        ciContext.render(image,
                         to: targetTexture,
                         commandBuffer: commandBuffer,
                         bounds: bounds,
                         colorSpace: colorSpace)

        commandBuffer?.present(view.currentDrawable!)
        commandBuffer?.commit()
    }
}

【问题讨论】:

    标签: swift4 metal


    【解决方案1】:

    我没有看到任何将device 设置为MTKView 的代码。没有deviceMTKView 将返回空drawable。我建议将此添加到viewDidLoad

    mtlView.device = device
    

    【讨论】: