この投稿は、Swift2.0でMetal入門にたしての解説です。
前回の投稿はこちらです。
目的
Metalの使用用途がGameというイメージが強すぎるので、通常のアプリや表現としても使えることを探っていきます。
注意
MetalはiOS8以上の固有機能です。Metalを動かすにはA7チップ以上のデバイスが必要です。Macで開発する場合は
シュミレーターではなく、実機で確認するようにしてください。
描画ステージ
今回は描画フェーズについてです。
レンダーパスデスクリプタを作成
レンダリングをするためにレンダーディスクリプタが必要です。テクスチャの設定、クリアカラーの設定などを行います。
クリアカラーとは描画するレイヤーを毎フレーム塗りつぶす色で、スクリーン上では
グラフィックスライブラリでは"塗りつぶし->描画ー>塗りつぶし->描画"を常に繰り返しています。
let renderPassDescriptor = MTLRenderPassDescriptor()
renderPassDescriptor.colorAttachments[0].texture = drawable?.texture
renderPassDescriptor.colorAttachments[0].loadAction = .Clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(
red: 1.0,
green: 1.0,
blue: 1.0,
alpha: 1.0
)
Commandバッファを取得
Commandバッファはレンダリングするための処理やモデリング情報を持った構造体みたいなものです。
このバッファを順番にGPUに渡します。GPU受け取った順に処理を実行します。動画のバッファを想像して貰えばよいかもしれませんが、バッファは次々とGPUに渡されますが、一つのバッファ処理が終わるまでは次のバッファにはとりかかれないので、前回作成したCommandキューにバッファを格納します。GPUはキューから順番にバッファを取り出して処理を進めます。
let commandBuffer = commandQueue.commandBuffer()
描画開始
描画の処理情報はCommandバッファー内にありますがそのままではGPUでは扱えません。
これを利用するにはコマンドバッファーをエンコードする必要があります。
MTLRenderCommandEncoderを作ります。
let renderEncoder: MTLRenderCommandEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
GPUが実行できるレンダリングコマンドを作ります。
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.setVertexBuffer(colorBuffer, offset: 0, atIndex: 1)
これでGPUが処理できる準備が整いました。
描画処理を実行します。
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 6, instanceCount: 1); // 描画
renderEncoder.endEncoding()
GPUの処理完了しました。最後に処理内容を画面上に表示します。
commandBuffer.presentDrawable(drawable!) // drawableはCAMetalLayerです。
commandBuffer.commit()
以上で描画が完了です。
まだもやもやしますね。この辺りはAppleのMetal Referenceをもう熟読する必要がありそうです。
引き続きMetal入門の記事で探ってみます。