最近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
}
}