最近iOsでMetalずいていたのでMacでMetalの覚書
■Step1:プロジェクト作成
 プロジェクト作成すると。

の画面が出てきますので「Applocation」は「Cocoa App」を選択し「Next」を押してください。

次に「Product Name」ですが今回は「Test01」としています(これはなんでもOKです)
 言語設定「Language」は「Swift」を設定してください。
 あと「Use Storyboards」にチェックを忘れずに
 「Next」を押し、ディレクトリを指定して「Create」を押せばプロジェクトの作成ができます。

このような画面が出てきます。
■Step2:MetalRendererクラス作成
プロジェクトに「MetalRenderer.swift」を追加します

MetalRenderer.swift
import MetalKit
let maxBuffersInFlight = 3
class MetalRenderer: NSObject, MTKViewDelegate {
    let _device: MTLDevice
    let _command_queue: MTLCommandQueue
    let _in_flight_semaphore = DispatchSemaphore(value: maxBuffersInFlight)
    
    init?(metalKitView: MTKView) {
        _device = metalKitView.device!
        guard let queue = _device.makeCommandQueue() else { return nil }
        _command_queue = queue
        
        metalKitView.colorPixelFormat = MTLPixelFormat.bgra8Unorm;
        
        super.init()
    }
    
    func draw(in view: MTKView) {
        _ = _in_flight_semaphore.wait(timeout: DispatchTime.distantFuture)
        if let command_buffer = _command_queue.makeCommandBuffer() {
            
            let semaphore = _in_flight_semaphore
            command_buffer.addCompletedHandler { (_ command_buffer)-> Swift.Void in
                semaphore.signal()
            }
            let render_pass_descriptor = view.currentRenderPassDescriptor
            render_pass_descriptor?.colorAttachments[0].loadAction=MTLLoadAction.clear
            render_pass_descriptor?.colorAttachments[0].storeAction=MTLStoreAction.store
            render_pass_descriptor?.colorAttachments[0].clearColor=MTLClearColorMake(1.0, 0.0, 0.0, 1.0)
            
            if let render_pass_descriptor = render_pass_descriptor, let render_encoder = command_buffer.makeRenderCommandEncoder(descriptor: render_pass_descriptor) {
                render_encoder.endEncoding()
                if let drawable = view.currentDrawable {
                    command_buffer.present(drawable)
                }
            }
            command_buffer.commit()
        }
    }
    
    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
    }
}
■Step3:ViewController.swiftの編集
ViewController.swift
import Cocoa
import MetalKit
class ViewController: NSViewController {
    var renderer: MetalRenderer!
    var mtkView: MTKView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let mtkView = self.view as? MTKView else {
            print("View attached to GameViewController is not an MTKView")
            return
        }
        
        // Select the device to render with.  We choose the default device
        guard let defaultDevice = MTLCreateSystemDefaultDevice() else {
            print("Metal is not supported on this device")
            return
        }
        
        mtkView.device = defaultDevice
        
        guard let newRenderer = MetalRenderer(metalKitView: mtkView) else {
            print("Renderer cannot be initialized")
            return
        }
        
        renderer = newRenderer
        renderer.mtkView(mtkView, drawableSizeWillChange: mtkView.drawableSize)
        mtkView.delegate = renderer
    }
}

