2021 Audio & VideoPhotos & CameraGraphics & Games
WWDC21 · 9 min · Audio & Video / Photos & Camera / Graphics & Games
Explore Core Image kernel improvements
Discover how you can add Core Image kernels written in the Metal Shading Language into your app. We’ll explore how you can use Xcode rules and naming conventions for Core Image kernels written in the Metal Shading Language, and help you make sense of Metal’s Stitchable functions and dynamic library features to benefit Core Image kernels.
Watch at developer.apple.com ↗Code shown on screen · 4 snippets
Extern CIKernels
// MyKernels.ci.metal
using namespace metal;
extern "C" float4 myKernel (coreimage::sample_t s,
float param,
coreimage::destination dest)
{
float4 result = s;
// Example code to create striped pattern
float diagLine = dest.coord().x + dest.coord().y;
float stripe = fract(diagLine/20.0 + param*2.0);
// Color range check
if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1)))
result = float4(2.0, 0.0, 0.0, 1.0);
return result;
} Load your extern CI kernel and apply it to create a new image
class MyFilter: CIFilter {
var inputImage: CIImage?
var inputParam: Float = 0.0
static var kernel: CIColorKernel = { () -> CIColorKernel in
let url = Bundle.main.url(forResource: "MyKernels",
withExtension: "ci.metallib")!
let data = try! Data(contentsOf: url)
return try! CIColorKernel(functionName: "MyKernel",
fromMetalLibraryData: data)
}()
override var outputImage : CIImage? {
get { guard let input = inputImage else { return nil }
return MyFilter.kernel.apply(extent:input.extent,
arguments:[input, inputParam]) }
}
} Stitchable CI Kernel
// MyKernels.ci.metal
using namespace metal;
[[stitchable]] float4 myKernel (coreimage::sample_t s,
float param,
coreimage::destination d)
{
float4 result = s;
// Example code to create striped pattern
float diagLine = dest.coord().x + dest.coord().y;
float stripe = fract(diagLine/20.0 + param*2.0);
// Color range check
if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1)))
result = float4(2.0, 0.0, 0.0, 1.0);
return result;
} Load your stitchable CI kernel and apply it to create a new image
class MyFilter: CIFilter {
var inputImage: CIImage?
var inputParam: Float = 0.0
static var kernel: CIColorKernel = { () -> CIColorKernel in
let url = Bundle.main.url(forResource: "default",
withExtension: "metallib")!
let data = try! Data(contentsOf: url)
return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data)
}()
override var outputImage : CIImage? {
get { guard let input = inputImage else { return nil }
return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) }
}
} Resources
Related sessions
-
27 min -
9 min -
6 min -
7 min