使用 Metal Performance Shaders 时可用的选项之一是就地过滤纹理。这在 What's New in Metal Part 2 中进行了讨论,但略微掩盖了实际的实现。更糟糕的是,后备复制分配器直到最新的 iOS 9 beta 版本才真正起作用,所以如果你一直在苦苦挣扎,这里有一篇简短的博客文章可以提供帮助。
过滤源纹理并填充目标纹理时, encodeToCommandBuffer() 具有以下签名:
encodeToCommandBuffer(commandBuffer, sourceTexture: srcTexture, destinationTexture: targetTexture)
但是,使用以下语法,我们可以将滤镜应用于适当的纹理:
encodeToCommandBuffer(commandBuffer, sourceTexture: srcTexture, destinationTexture: targetTexture)
一些过滤器,例如 MPSImageMedian 无法就地过滤,在这种情况下,我们需要创建一个 MPSCopyAllocator 实例,它会创建一个纹理并确保就地版本的 encodeToCommandBuffer 始终成功。实际上并没有可用的 descriptorFromTexture() 方法(如 WWDC 视频中所示),因此 copyAllocator 的正确 Swift 定义是:
encodeToCommandBuffer(commandBuffer, sourceTexture: srcTexture, destinationTexture: targetTexture)
...现在以下将起作用:
encodeToCommandBuffer(commandBuffer, sourceTexture: srcTexture, destinationTexture: targetTexture)
简单的!