MetalCanvas
概要
このフレームワークは、processingの思想に影響を受けています。
processingにおけるOpenGLのように、Metalを少ない手続き・インターフェースで使えることを目指しています。
少ないコードで キャンバスに絵を描くようにコードで絵を描きます。
点や四角などのプリミティブの描画や画像処理。
そういった事を簡単に行なえます。
Processing is a flexible software sketchbook and a language for learning how to code within the context of the visual arts. Since 2001, Processing has promoted software literacy within the visual arts and visual literacy within technology. There are tens of thousands of students, artists, designers, researchers, and hobbyists who use Processing for learning and prototyping.
参考
Metal学習参考
Interface
- MCCore: 初期化やCommandBufferの生成など
- MCCanvas: 描画情報をセット
- MCImageRenderView: CanvasのRender
- MCColor: 色に関する
- MCGeom: Vector や Matrix
- MCPrimitive: PointやRectangle等のプリミティブ
- MCFilter: 画像処理フィルター
サンプルコード
- まず AppDelegate.swift → MCCore.setup で初期化します。
import UIKit
import MetalCanvas
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
do {
// 初期化
try MCCore.setup(contextPptions: [
CIContextOption.workingColorSpace : CGColorSpaceCreateDeviceRGB(),
CIContextOption.useSoftwareRenderer : NSNumber(value: false)
])
} catch {
}
return true
}
- 実際に使う際には下記のサンプルコードの流れで使用します。
- MTLCommandBufferを生成(MTLCommandBufferについて)
- MCCanvasを生成
- キャンバスに描画したいプリミティブをセット
- MCImageRenderViewを更新(描画)
※ 生成した commandBuffer は MCImageRenderView. updateでcommitされ、MCImageRenderViewに描画されます。
※ MTLCommandBufferは一度 commit されると、無効になります。
※ 動画のフレーム毎の処理のような繰り返し描画を行う場合には、都度 MTLCommandBuffer生成 → commit を繰り返します。
do {
// MTLCommandBufferを生成
var commandBuffer: MTLCommandBuffer = MCCore.commandQueue.makeCommandBuffer()!
// キャンバスを生成
let canvas: MCCanvas = try MCCanvas.init(destination: &destinationTexture, orthoType: .topLeft)
// キャンバスに描画したいプリミティブをセット
try canvas.draw(commandBuffer: &commandBuffer, objects: [
// キャンバスにポイントを描画
MCPoint.init(
psition: MCGeom.Vec3D.init(x: 0, y: 0, z: 0),
color: MCColor.init(hex: "0xFF0000"), size: 200.0
),
MCPoint.init(
psition: MCGeom.Vec3D.init(x: 300, y: 10, z: 0),
color: MCColor.init(hex: "0xFFFF00"), size: 300.0
)
])
// MCImageRenderViewを更新(描画)
self.imageRender?.update(
commandBuffer: commandBuffer,
texture: destinationTexture,
renderSize: renderSize,
queue: nil
)
} catch {
}
サンプルコード 画像描画
サンプルコード リアルタイム描画
Installation
Carthage
github "Hideyuki-Machida/MetalCanvas"
Coming Soon
- Noise
- Filter
- Morphing
- Vision