【发布时间】:2020-03-31 10:34:06
【问题描述】:
iOS 和 Mac 上的 Metal Shader 语言有什么主要区别吗?我正在尝试从 iOS 移植我的 Metal cifilter,它们看起来完全不同
【问题讨论】:
标签: kernel metal cifilter cikernel
iOS 和 Mac 上的 Metal Shader 语言有什么主要区别吗?我正在尝试从 iOS 移植我的 Metal cifilter,它们看起来完全不同
【问题讨论】:
标签: kernel metal cifilter cikernel
是的,平台之间在语言层面上应该没有区别。
我能想到的一个区别是 macOS 支持每通道 32 位的图像(“全”浮点),而在 iOS 中,您“只能”使用 16 位半浮点图像。
刚刚想到的另一个区别是输入采样器的默认坐标空间。在 iOS 中,采样器空间是相对坐标 ([0...1]),而在 macOS 中是绝对坐标 ([0...width])。您应该能够通过像这样(在 macOS 中)显式设置采样器矩阵来统一该行为:
// see documentation for `kCISamplerAffineMatrix`
let scaleMatrix = [1.0/inputImage.extent.width, 0, 0, 1.0/inputImage.extent.height, 0, 0]
let inputSampler = CISampler(image: inputImage, options: [kCISamplerAffineMatrix: scaleMatrix])
kernel.apply(extent: domainOfDefinition, roiCallback: roiCallback, arguments: [inputSampler, ...])
【讨论】:
src.coord() 在平台上默认情况下不同的内容:在 iOS 中,您获得相对坐标 (0...1),而在 macOS 中,这些是绝对坐标 (0 ...宽度)。您应该能够通过更改使用kCISamplerAffineMatrix 参数传递给内核的CISampler 的缩放比例来进行调整。