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に設定します
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
        }
    }