Металл Custom CIFilter отличается возвращаемое значение - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу CIFilter, но цвета пикселей результата отличаются от значений, возвращаемых функцией металла.

kernel.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)) после того, как функция металла возвращает значения.

1 Ответ

0 голосов
/ 22 июня 2019

Базовое изображение выполняет сопоставление цветов два раза при обработке изображения: из цветового пространства, если входное изображение, в рабочее цветовое пространство CIContext и на последнем этапе рендеринга после всех фильтровбыли применены от рабочего цветового пространства до выходного цветового пространства контекста.

Эти цветовые пространства настроены со значениями по умолчанию, которые, по моему опыту, зависят от устройства (и егодисплей) вы работаете на.Однако вы можете определить оба цветовых пространства, используя опции kCIContextWorkingColorSpace и kCIContextOutputColorSpace при создании CIContext.

Если вы установите оба значения на NSNull(), Core Image не будет выполнять какое-либо сопоставление цветов, обрабатывая все значения цвета, как они есть в буферах изображений.Тем не менее, ваш фильтр, вероятно, имеет некоторые предположения о цветовом пространстве входных выборок.Так что имейте это в виду, когда вы имеете дело с входными данными из таких источников, как камера, которые могут иметь разные цветовые пространства в зависимости от устройства и конфигурации камеры.

Другой способ гарантировать, что входные образцы всегда находятся в цветовом пространстве, которое вывам нужно установить параметр kCISamplerColorSpace при создании CISampler, который служит входом для вашего собственного ядра.

...