Swift3 CoreImage-CIColorCube在使用金属加工时会产生令人尴尬的结果

Swift3 CoreImage-CIColorCube在使用金属加工时会产生令人尴尬的结果,swift3,core-image,Swift3,Core Image,我有一个非常简单的设置与CIColorCube根据苹果文档。使用默认未修改的值进行过滤时,输出图像完全关闭-99.9%的图像是透明的,只有几个像素可见 更新 我已经(部分)弄明白了问题所在——我正在使用金属进行图像处理。在标准OpenGL上下文中处理时,一切都按预期工作 这个问题仍然有效-为什么处理CIColorCube在金属背景下过滤图像完全关闭 金属上下文创建: guard let device:MTLDevice = MTLCreateSystemDefaultDevice() e

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

更新

我已经(部分)弄明白了问题所在——我正在使用金属进行图像处理。在标准OpenGL上下文中处理时,一切都按预期工作

这个问题仍然有效-为什么处理
CIColorCube
在金属背景下过滤图像完全关闭

金属上下文创建:

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

let context = CIContext(
    mtlDevice: device
)
let context = CIContext()
OpenGL上下文创建:

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

let context = CIContext(
    mtlDevice: device
)
let context = CIContext()
输出图像的比较:

更新结束

标准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
}
let size=64
var cubeData=[Float](重复:0,计数:size*size*size*4)
变量rgb:[浮动]=[0,0,0]
var偏移量=0
对于0..<尺寸中的z{
rgb[2]=浮点(z)/浮点(大小)//蓝色
对于0..<尺寸中的y{
rgb[1]=浮动(y)/浮动(大小)//绿色
对于0中的x..<尺寸{
rgb[0]=浮点(x)/浮点(大小)//红色
立方数据[offset]=rgb[0]
立方数据[offset+1]=rgb[1]
立方数据[偏移量+2]=rgb[2]
立方数据[偏移量+3]=1.0
偏移量+=4
}
}
}
let data=data(缓冲区:UnsafeBufferPointer(开始:&cubeData,计数:cubeData.count))
警卫
让colorCubeFilter=CIFilter(名称:“CIColorCube”)
否则{
归零
}
colorCubeFilter.setValue(inputImage,forKey:“inputImage”)
colorCubeFilter.setValue(大小,forKey:“inputCubeDimension”)
colorCubeFilter.setValue(数据,forKey:“inputCubeData”)
警卫
让结果=colorCubeFilter.outputImage
否则{
归零
}

很难从这里得到的信息判断。但是来自过滤器文档的这一注释可能是相关的:与所有颜色过滤器一样,此操作是在执行过滤器的核心图像上下文(CIContext)的工作颜色空间中执行的,使用未乘以的像素颜色值。如果看到意外结果,请验证输出和工作颜色空间是否按预期设置。不幸的是,这不是颜色空间问题。我已尝试为上下文和
cicolorcuithcolorspace
过滤器设置相同的颜色空间。而且,完全丢弃颜色空间也没有帮助。。。最好的猜测是,金属支持的上下文设置其缓冲区格式的方式可能有问题。绝对值得。你充分解释了什么是“标准”颜色地图是一个巨大的帮助-为什么苹果没有这样做???