CoreImage - CIColorCube在使用Metal处理时会产生尴尬的结果

时间:2016-11-07 19:52:20

标签: swift3 core-image

根据Apple文档,我对CIColorCube进行了非常简单的设置。使用默认的未修改值进行过滤时,输出图像完全关闭 - 99.9%的图像是透明的,此处只有几个像素可见。

更新

我(部分)弄明白问题是什么 - 我使用Metal进行CIImage处理。在标准OpenGL上下文中处理时,一切都按预期工作。

这个问题仍然有效 - 为什么在Metal Context中处理CIColorCube过滤器时图像完全关闭?

金属上下文创建:

guard
    let device:MTLDevice = MTLCreateSystemDefaultDevice()
else {
    return nil
}

let context = CIContext(
    mtlDevice: device
)

OpenGL上下文创建:

let context = CIContext()

输出图像的比较:

enter image description here

END OF UPDATE

标准CIColorCube的代码:

let size = 64

var cubeData = [Float](repeating: 0, count: size * size * size * 4)

var rgb:[Float] = [0, 0, 0]

var offset = 0

for z in 0 ..< size {
    rgb[2] = Float(z) / Float(size) // blue

    for y in 0 ..< size {
        rgb[1] = Float(y) / Float(size) // green

        for x in 0 ..< size {
            rgb[0] = Float(x) / Float(size) // red

            cubeData[offset]   = rgb[0]
            cubeData[offset+1] = rgb[1]
            cubeData[offset+2] = rgb[2]
            cubeData[offset+3] = 1.0

            offset += 4
        }
    }
}

let data = Data(buffer: UnsafeBufferPointer(start: &cubeData, count: cubeData.count))

guard
    let colorCubeFilter = CIFilter(name: "CIColorCube")
else {
    return nil
}

colorCubeFilter.setValue(inputImage, forKey: "inputImage")
colorCubeFilter.setValue(size, forKey: "inputCubeDimension")
colorCubeFilter.setValue(data, forKey: "inputCubeData")

guard
    let result = colorCubeFilter.outputImage
else {
    return nil
}

0 个答案:

没有答案