我使用Core Image Metal内核,为了使其工作,需要将
-fcikernel
添加到构建设置中的Other Metal Complie Flags
和Other Metal Link Flags
。
这是谈论此问题的文章。
但是添加flag之后 这里的金属着色器无法加载。
@available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, visionOS 1.0, *)
internal struct GlurModifier: ViewModifier {
public var radius: CGFloat
public var offset: CGFloat
public var interpolation: CGFloat
public var direction: BlurDirection
@Environment(\.displayScale) var displayScale
let library = ShaderLibrary.default
var blurX: Shader {
var shader = library.blurX(.float(radius),
.float(offset),
.float(interpolation),
.float(Float(direction.rawValue)),
.float(displayScale))
shader.dithersColor = true
return shader
}
NSBundle ....simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MetalTools.framework/主体类为零,因为所有后备都失败了
找到了一个解决方法,似乎目标中的所有金属文件都会被构建到一个普通的
.metallib
库中。但添加 -fcikernel
使其适用于 CIKernel。我最终使用命令行构建了其中一个 .metallib
。
xcrun -sdk iphoneos metal -c -mios-version-min=15.0 blur.metal -o blur.air
xcrun -sdk iphoneos metallib blur.air -o blur.metallib
然后将输出文件添加到目标。
let library = ShaderLibrary(url: Bundle.main.url(forResource: "blur", withExtension: "metallib")!)
缺点是更新metal文件时必须手动构建,并且无法在模拟器上运行。猜猜更好的方法是将两个不同的金属源文件分离到框架中?