gpt4 book ai didi

ios - Metal Custom CIFilter 不同的返回值

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:36 27 4
gpt4 key购买 nike

我正在编写 CIFilter,但结果像素颜色与 Metal 函数的返回值不同。

内核 Metal

#include <CoreImage/CoreImage.h>

extern "C" { namespace coreimage {

float4 foo(sample_t rgb){

return float4(0.3f, 0.5f, 0.7f, 1.0f);

}
}

Metal 过滤器.swift

import CoreImage

class MetalFilter: CIFilter {

private let kernel: CIColorKernel

var inputImage: CIImage?

override init() {
let url = Bundle.main.url(forResource: "default", withExtension: "metallib")!
let data = try! Data(contentsOf: url)
kernel = try! CIColorKernel(functionName: "foo", fromMetalLibraryData: data)
super.init()
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

func outputImage() -> CIImage? {
guard let inputImage = inputImage else {return nil}
return kernel.apply(extent: inputImage.extent, arguments: [inputImage])
}
}

当我得到 outputImage 时,我有这些值:
R = 0.58431372549019611
G = 0.73725490196078436
B = 0.85490196078431369

它是某种后处理(比如 pow(x, 1/2.373) 在 metal 函数返回值之后。

最佳答案

Core Image 在处理图像时会执行两次颜色匹配:从输入图像的颜色空间到 CIContext工作颜色空间,并且在应用所有滤镜后的最终渲染步骤中,从工作颜色空间到上下文的输出颜色空间

这些颜色空间配置有默认值,根据我的经验,这些值取决于您运行的设备(及其显示器)。但是,您可以使用 kCIContextWorkingColorSpace 定义两个颜色空间。和 kCIContextOutputColorSpace创建 CIContext 时的选项。

如果您将这两个值都设置为NSNull(),Core Image 将不会执行任何颜色匹配,而是将所有颜色值视为图像缓冲区中的颜色值。但是,您的过滤器可能对输入样本的颜色空间有一些假设。因此,当您处理来自相机等来源的输入时,请记住这一点,这些来源可能具有不同的色彩空间,具体取决于设备和相机配置。

另一种确保输入样本始终在您需要的颜色空间中的方法是设置 kCISamplerColorSpace创建用作自定义内核输入的 CISampler 时的选项。

关于ios - Metal Custom CIFilter 不同的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53619209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com