2016-10-20 7 views
3

AVFoundationから画像をキャプチャし、出力にフィルタを適用するためにSimon Gladman(@flexmonkey)によってthis tutorialを完成しました。しかし、私はぼかしフィルタを自分の計算シェーダに置き換える方法を見つけるのに苦労しています。言い換えれば、そこに記載されているYCbCrColorConversionフィルタの後にカスタムシェーダを連結する必要があります。iOS用メタルのフィルタをチェーンするには?

let commandBuffer = commandQueue.makeCommandBuffer() 
let commandEncoder = commandBuffer.makeComputeCommandEncoder() 
// pipelineState has compiled YCbCrColorConversion filter 
commandEncoder.setComputePipelineState(pipelineState) 
commandEncoder.setTexture(ytexture, at: 0) 
commandEncoder.setTexture(cbcrTexture, at: 1) 
commandEncoder.setTexture(drawable.texture, at: 2) // out texture 

commandEncoder.dispatchThreadgroups(threadGroups,threadsPerThreadgroup: threadGroupCount) 
commandEncoder.endEncoding() 

let inPlaceTexture = UnsafeMutablePointer<MTLTexture> .allocate(capacity: 1) 
     inPlaceTexture.initialize(to: drawable.texture) 

// How to replace this blur with my own filter????? 
blur.encodeToCommandBuffer(commandBuffer, inPlaceTexture: inPlaceTexture, fallbackCopyAllocator: nil) 

commandBuffer.presentDrawable(drawable) 
commandBuffer.commit(); 

新しいcommandBuffer、commandEncoder、および別のpipelineStateを作成して、2番目のカーネル関数をコンパイルする必要がありますか?これは、第1のフィルタの出力を第2のフィルタの入力とする。これを行うより効率的な方法がありますか、それとも最適ですか?

私はMetalの初心者です。パイプラインの仕組みについての説明は高く評価されています。

答えて

5

新しいコマンドバッファまたは別の計算エンコーダを作成する必要はありませんが、独自のカーネル関数を使用する計算パイプライン状態を作成する必要があります。現在、YCbCr変換パイプライン状態を作成している場合は、初期化中にこれを1回実行する必要があります。

効果を連鎖させるには、YCbCr変換の出力テクスチャとカーネルの入力として機能する中間テクスチャを作成する必要があります。 drawableテクスチャはカーネル関数の出力テクスチャになります。現在、YCbCr変換のための作業をディスパッチしている(つまり、スレッドグループごとのスレッド数とスレッドグループ数が同じであるように)自分のカーネルのために作業をディスパッチできます。

中間テクスチャは、おそらくドロアブルと同じ寸法とフォーマットである必要があります。遅延描画を作成して参照を保持し、描画可能なサイズが変更されたときに再作成することができます。

関連する問題