【发布时间】:2022-02-06 22:23:24
【问题描述】:
我编写了以下 Metal Core Image Kernel 来产生恒定的红色。
extern "C" float4 redKernel(coreimage::sampler inputImage, coreimage::destination dest)
{
return float4(1.0, 0.0, 0.0, 1.0);
}
然后我在 Swift 代码中有这个:
class CIMetalRedColorKernel: CIFilter {
var inputImage:CIImage?
static var kernel:CIKernel = { () -> CIKernel in
let bundle = Bundle.main
let url = bundle.url(forResource: "Kernels", withExtension: "ci.metallib")!
let data = try! Data(contentsOf: url)
return try! CIKernel(functionName: "redKernel", fromMetalLibraryData: data)
}()
override var outputImage: CIImage? {
guard let inputImage = inputImage else {
return nil
}
let dod = inputImage.extent
return CIMetalRedColorKernel.kernel.apply(extent: dod, roiCallback: { index, rect in
return rect
}, arguments: [inputImage])
}
}
如您所见,dod 是输入图像的范围。但是当我运行过滤器时,我得到一个超出输入图像范围(DOD)的整个红色图像,为什么?我有多个过滤器链接在一起,整体尺寸为 1920x1080。红色滤镜不应该只对传入的 DOD 矩形运行,并为 DOD 之外的任何内容生成清晰的像素吗?
【问题讨论】:
标签: ios metal core-image cifilter