繁体   English   中英

如何在Metal for iOS中链接过滤器?

[英]How to chain filters in Metal for iOS?

我完成了Simon Gladman(@flexmonkey)的教程 ,从AVFoundation捕获图像并对输出应用过滤器。 但是,我正在努力找到一种用我自己的计算着色器替换模糊滤镜的方法。 换句话说,我需要在YCbCrColorConversion提到的YCbCrColorConversion过滤器之后连接我的自定义着色器。

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吗? 这将把第一个滤波器的输出作为第二个滤波器的输入。 有没有更有效的方法来做到这一点,或者这是最佳的?

我是Metal的初学者,因此对管道如何工作的任何解释都受到高度赞赏。

您不需要创建新的命令缓冲区或其他计算编码器,但您需要创建使用您自己的内核函数的计算管道状态。 在初始化期间,无论您当前正在创建YCbCr转换管道状态,都应该执行一次此操作。

要将效果链接在一起,您需要创建一个中间纹理,作为YCbCr转换的输出纹理和内核的输入。 然后,可绘制纹理将是内核函数的输出纹理。 您可以为当前调度YCbCr转换工作(即每个线程组和线程组计数具有相同数量的线程)调度您自己内核的工作。

中间纹理应该与drawable具有相同的尺寸和格式。 您可以懒惰地创建它并保持对它的引用,在可绘制的大小更改时重新创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM