【问题标题】:Are there any differences between Metal kernels on iOS and Mac?iOS 和 Mac 上的 Metal 内核有什么不同吗?
【发布时间】:2020-03-31 10:34:06
【问题描述】:

iOS 和 Mac 上的 Metal Shader 语言有什么主要区别吗?我正在尝试从 iOS 移植我的 Metal cifilter,它们看起来完全不同

【问题讨论】:

    标签: kernel metal cifilter cikernel


    【解决方案1】:

    是的,平台之间在语言层面上应该没有区别。

    我能想到的一个区别是 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, ...])
    

    【讨论】:

    • 嗯...有没有办法将一个完整的浮动 CIImage 转换为一个半浮动的?
    • 你需要这个做什么?
    • 我正在尝试找出一种方法,让现有的 Metal 内核产生与 iOS 上相同的结果,而无需重写它们。我认为这会有所帮助。
    • 您应该可以在 iOS 上毫无问题地使用它。这只是可能在平台上不同的像素值的最大精度。但对于大多数(颜色)操作来说,8 位或 16 位就绰绰有余了。
    • 啊,我想我读到了一些关于src.coord() 在平台上默认情况下不同的内容:在 iOS 中,您获得相对坐标 (0...1),而在 macOS 中,这些是绝对坐标 (0 ...宽度)。您应该能够通过更改使用kCISamplerAffineMatrix 参数传递给内核的CISampler 的缩放比例来进行调整。
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 2019-09-26
    • 2018-06-10
    • 2011-05-31
    • 2010-09-15
    • 1970-01-01
    • 2011-03-17
    • 2019-07-30
    相关资源
    最近更新 更多