Metal 三角形

2019-06-24  本文已影响0人  HChase

一,设置MTKView

   var metalView: MTKView {
        return view as! MTKView
    }
    let d = MTLCreateSystemDefaultDevice()
    metalView.device = device
    metalView.clearColor = MTLClearColorMake(0.3, 0.3, 0.3, 1)
    renderer = Render(device: device)
    metalView.delegate = renderer

二,设置管道状态MTLRenderPipelineState

   self.commandQueue = device.makeCommandQueue()!
    self.vertexBuffer = device.makeBuffer(bytes: verters,
                                              length: verters.count * MemoryLayout<Float>.size, options: [])
    let libary = device.makeDefaultLibrary()
    let vertextFuncion = libary?.makeFunction(name: "vertex_shader") // 设置顶点着色器
    let fragmentFuncion = libary?.makeFunction(name: "fragment_shader") // 设置片元着色器
        
    let pipelineDescriptor = MTLRenderPipelineDescriptor()
    pipelineDescriptor.vertexFunction = vertextFuncion
    pipelineDescriptor.fragmentFunction = fragmentFuncion
    pipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm // 设置颜色的像素格式为32位
        
    do {
       pipelineState = try device.makeRenderPipelineState(descriptor: pipelineDescriptor)
    } catch let error as NSError {
       print("error: \(error.localizedDescription)")
    }

三、绘制模型

// 每帧回调
    func draw(in view: MTKView) {
        guard let drawable = view.currentDrawable,
            let pipelineState = pipelineState,
            let descriptor = view.currentRenderPassDescriptor else {return}
        
        //  创建命令缓存区 / 命令编码器
        let commandBuffer = commandQueue.makeCommandBuffer()
        let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor) // 描述符
        
        commandEncoder?.setRenderPipelineState(pipelineState)
        commandEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0)  // 设置如何从缓存数组读取顶点到命令缓存区
        commandEncoder?.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: verters.count)
        commandEncoder?.endEncoding()
        
        commandBuffer?.present(drawable) //
        commandBuffer?.commit() // 
    }

源代码Metal_Triangle

上一篇 下一篇

猜你喜欢

热点阅读