通常使用 CIFilter 可以对图像做一些处理,如果有些效果我们不满意,我们需要自己去实现的话,是可以通过写 metal 来自定义 CIFilter,和 fragment shader 类似,处理对象都是一个像素点。
如何使用 metal shader 自定义 CIFilter 网上的教程有很多,我这里还是赘述一下。
第一步:创建一个.metal文件,定义 filter。记住自己的方法名,后面需要用到。
第二步:继承 CIFilter 定义出一个子类,通过加载 default.metallib 找到对应的方法即可。
第三步:在 Build Settings 里面加入两个flag。
下面是第一步的代码,随便定义一个文件比如叫 kernel.metal,里面放上这些代码。注意到这里的方法名是 myColor。
myColor 方法就是简单的返回当前点的颜色。
#include <metal_stdlib>
#include <CoreImage/CoreImage.h>
using namespace metal;
extern "C" {
namespace coreimage {
float4 myColor(sample_t s, float value) {
return s.rgba;
}
}
}
第二步,建立一个自己的 CIFilter 子类,然后做下面这些事情。
class CustomFilter : CIFilter {
var value: Double