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の初心者です。パイプラインの仕組みについての説明は高く評価されています。