Help us understand the problem. What is going on with this article?

【Swift2.0でMetal入門】2.Metalの描画フェーズ

More than 5 years have passed since last update.

この投稿は、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入門の記事で探ってみます。

pol-inc
「未来を加速する(Accelerate the Future.)」 それがPOLのミッションです。 課題解決とイノベーションにより、良い未来の到来を早める。私たちにしか創れない良い未来を創る。 私たちがPOLに集まっているのは、このためです。
https://pol.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away