Я пишу CIFilter, но цвета результирующих пикселей отличаются от значений, возвращаемых функцией metal.
ядро.металл
#include <CoreImage/CoreImage.h>
extern "C" { namespace coreimage {
float4 foo(sample_t rgb){
return float4(0.3f, 0.5f, 0.7f, 1.0f);
}
}
MetalFilter.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 возвращает значения.
srgb_to_linear
перед возвратом значения. Это будет отменено преобразованием linear-to-srgb, которое происходит при выводе. Автоматическое преобразование sRGB - это то, что вам нужно большую часть времени, и на современных графических процессорах Apple это фактически бесплатно. - person warrenm   schedule 04.12.2018