Metal学習(2)
1759 ワード
MTKViewはNSView/UIViewのサブクラスで、framebuffer、レンダリングターゲット、drawループの管理を担当する埋め込みMetalレイヤがあります.
•device-GPUの抽象、command queueのコマンドの処理、レンダリングなど
•command queue-一連のcommand bufferで、コマンドの実行順序が格納されており、GPUに一度実行するように伝えるコマンドがリストにロードされていることを想像します.
•command buffer-command encoder変換後のコマンドが格納されます.このフレームで実行したいレンダリングコマンドの一連として想像できます.command bufferを提出する前に、本当に起こることはありません.そうすれば、物事がいつ起こるかをコントロールすることができます.
•command encoder-APIコマンドをGPUコマンドに変換するには、encoder:render(グラフィックレンダリング)、compute(データ並列処理)、blit(リソースコピー操作)の3種類があります.
Render Command Encoder(RCE)はレンダリングコマンドで、完了したらendEncoding()を呼び出すだけです.MTLRenderPassDescriptorは、どのテクスチャがレンダリングされるか、clear colorとは何か、その他の構成を構成できます.
1.cocoaアプリケーションを作成し、swiftとuse storyboardsのみを選択します.
2.NSViewタイプのMetalViewを作成します.swift、storyboardのview controllerでViewを選択し、下図のようにIdentity InspectorでそのクラスをMetalViewに設定します
•device-GPUの抽象、command queueのコマンドの処理、レンダリングなど
•command queue-一連のcommand bufferで、コマンドの実行順序が格納されており、GPUに一度実行するように伝えるコマンドがリストにロードされていることを想像します.
•command buffer-command encoder変換後のコマンドが格納されます.このフレームで実行したいレンダリングコマンドの一連として想像できます.command bufferを提出する前に、本当に起こることはありません.そうすれば、物事がいつ起こるかをコントロールすることができます.
•command encoder-APIコマンドをGPUコマンドに変換するには、encoder:render(グラフィックレンダリング)、compute(データ並列処理)、blit(リソースコピー操作)の3種類があります.
Render Command Encoder(RCE)はレンダリングコマンドで、完了したらendEncoding()を呼び出すだけです.MTLRenderPassDescriptorは、どのテクスチャがレンダリングされるか、clear colorとは何か、その他の構成を構成できます.
1.cocoaアプリケーションを作成し、swiftとuse storyboardsのみを選択します.
2.NSViewタイプのMetalViewを作成します.swift、storyboardのview controllerでViewを選択し、下図のようにIdentity InspectorでそのクラスをMetalViewに設定します
import MetalKit
class MetalView: MTKView {
required init(coder: NSCoder) {
super.init(coder: coder)
device = MTLCreateSystemDefaultDevice()
}
// override draw
override func draw(_ dirtyRect: NSRect) {
if let drawable = currentDrawable, let rpd = currentRenderPassDescriptor {
rpd.colorAttachments[0].texture = currentDrawable!.texture
rpd.colorAttachments[0].clearColor = MTLClearColor(red: 0, green: 0.5, blue: 0.5, alpha: 1)
rpd.colorAttachments[0].loadAction = .clear // ,
let commandBuffer = device!.makeCommandQueue().makeCommandBuffer()
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd)
commandEncoder.endEncoding()
commandBuffer.present(drawable) //
commandBuffer.commit() // , GPU
}
}