MacでSwiftを使ってMetalを初期化

最近iOsでMetalずいていたのでMacでMetalの覚書
■Step1：プロジェクト作成
---
　プロジェクト作成すると。
![スクリーンショット 2018-11-19 17.59.21.png](https://qiita-image-store.s3.amazonaws.com/0/122121/f2fcd1a1-fae0-2d84-6017-62aa37040102.png)
の画面が出てきますので「Applocation」は「Cocoa App」を選択し「Next」を押してください。
![スクリーンショット 2018-11-19 17.59.35.png](https://qiita-image-store.s3.amazonaws.com/0/122121/50d61a54-9e47-1b21-896a-1cea043145b3.png)
次に「Product Name」ですが今回は「Test01」としています（これはなんでもOKです）
　言語設定「Language」は「Swift」を設定してください。
　あと「Use Storyboards」にチェックを忘れずに
　「Next」を押し、ディレクトリを指定して「Create」を押せばプロジェクトの作成ができます。
![スクリーンショット 2018-11-19 17.59.51.png](https://qiita-image-store.s3.amazonaws.com/0/122121/f5e5f238-f53f-8504-9138-e65b2e97dd9c.png)
このような画面が出てきます。
■Step2：MetalRendererクラス作成
プロジェクトに「MetalRenderer.swift」を追加します
![スクリーンショット 2018-11-19 18.01.02.png](https://qiita-image-store.s3.amazonaws.com/0/122121/75caec0b-547b-e601-7345-c0716d6dc567.png)

```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の編集
---
```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
    }
}
```
■Step4：Viewの設定
---
![スクリーンショット 2018-11-19 18.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/122121/99e5596a-6fea-cf70-dddd-8f1bc4f99b3f.png)
「Main.storyboad」から「View」を選択します。
すると右側にClassを設定する所が出てきますのでそこに「MTKView」を指定してください。
■Step5：実行
---
赤い画面が現れます
![スクリーンショット 2018-11-19 18.03.41.png](https://qiita-image-store.s3.amazonaws.com/0/122121/f15e1d27-d73a-fb05-5f34-b7631856d99c.png)