ios - 在 Metal 计算着色器中使用MPSImageConvolution内核

标签 ios xcode convolution metal compute-shader

我正在使用位于https://github.com/FlexMonkey/MetalVideoCapture的MetalVideoCapture示例。我在版本中所做的唯一更改是使用带有内核值的MPSImageConvolution(而不是MPSImageGaussianBlur):

[-2.0, -1.0, 0.0,
 -1.0,  1.0, 1.0, 
  0.0,  1.0, 2.0]

使用上面的值无法以任何可见的方式更改输出。但是边缘增强了内核例如
[0.0, -1.0, 0.0, 
 0.0,  1.0, 0.0, 
 0.0,  0.0, 0.0]

有用,只按主要顺序排列即可;即使多数民众赞成在MPSImageConvolution期望的那样,它也不以行为主的顺序工作。我真的为此感到难过。我不知道是否有明显的原因卷积内核无法在计算管道中工作(仅在渲染管道中),但是我无法在线找到任何信息。

我还修改了代码库,将内核应用于静态图像,而不是实时视频源。但是,这产生了相同的结果。

我还想指出,我在示例项目的留言板上(https://github.com/FlexMonkey/MetalVideoCapture/issues/1#issuecomment-217609500)发布了相同的问题。该示例的作者和我一样受挫,这使我相信这是某种错误或我的概念性知识中的空白,为什么这甚至不起作用。

最佳答案

我确实有一种解决方法,那就是避免使用就地纹理。尝试以下操作:创建一个单独的目标纹理:

    let descriptor = MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(
        drawable.texture.pixelFormat,
        width: drawable.texture.width,
        height: drawable.texture.height,
        mipmapped: false)

    let destination: MTLTexture = device!.newTextureWithDescriptor(descriptor)

YCbCrColorConversion着色器定位目标:
commandEncoder.setTexture(destination, atIndex: 2) // out texture

...然后使用使用目标的替代encodeToCommandBuffer:
encodeToCommandBuffer(commandBuffer, sourceTexture: destination, destinationTexture: drawable.texture)

这些东西可以删除:
//        let inPlaceTexture = UnsafeMutablePointer<MTLTexture?>.alloc(1)
//        inPlaceTexture.initialize(drawable.texture)

西蒙

感谢Warren!

关于ios - 在 Metal 计算着色器中使用MPSImageConvolution内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37117892/

相关文章:

c++ - XCode 8 链接器 (ld) 抑制警告

python - 具有不同滤波器尺寸的 tensorflow 卷积

c++ - 可分离核的卷积

ios - objective-c 自定义比较:优先

ios - UIActivityViewController : tint color of presented view controllers

ios - Xcode 4,基于 View 的应用程序 + UITableView 向上滚动时崩溃

neural-network - 在深度神经网络中使用卷积 1x1 的原因是什么?

objective-c - 如何释放分配的条形按钮项目

ios - 如果今天是本月的最后一天,如何在 ios 中显示从当前日期算起的 7 天

iphone - 支持旧的 iOS 版本和设备