一,设置MTKView
- 将ViewController的view设置为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
- 使用GPU设备(MTLDevice)创建命令管道;
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)")
}
三、绘制模型
- 遵守MTKViewDelegate协议,实现其方法;
// 每帧回调
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