-
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.
Ressources
Vidéos connexes
WWDC21
WWDC20
-
Rechercher dans cette vidéo…
-
-
3:54 - Extern CIKernels
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h 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; } -
4:32 - 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]) } } } -
6:18 - Stitchable CI Kernel
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h 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; } -
6:40 - 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]) } } }
-