【发布时间】:2020-01-05 04:17:54
【问题描述】:
我正在尝试通过对 Core Image 使用金属着色语言从 source 移植一些 CIFilter。
我有一个由 RGB 结构数组组成的调色板,我想将它们作为参数传递给自定义 CI 彩色图像内核。
RGB 结构体被转换为SIMD3<Float> 的数组。
static func SIMD3Palette(_ palette: [RGB]) -> [SIMD3<Float>] {
return palette.map{$0.toFloat3()}
}
内核应该采用 simd_float3 值的数组,问题是当我启动过滤器时,它告诉我索引 1 处的参数需要 NSData。
override var outputImage: CIImage? {
guard let inputImage = inputImage else
{
return nil
}
let palette = EightBitColorFilter.palettes[Int(inputPaletteIndex)]
let extent = inputImage.extent
let arguments = [inputImage, palette, Float(palette.count)] as [Any]
let final = colorKernel.apply(extent: extent, arguments: arguments)
return final
}
这是内核:
float4 eight_bit(sample_t image, simd_float3 palette[], float paletteSize, destination dest) {
float dist = distance(image.rgb, palette[0]);
float3 returnColor = palette[0];
for (int i = 1; i < floor(paletteSize); ++i) {
float tempDist = distance(image.rgb, palette[i]);
if (tempDist < dist) {
dist = tempDist;
returnColor = palette[i];
}
}
return float4(returnColor, 1);
}
我想知道如何将数据缓冲区传递给内核,因为将其转换为 NSData 似乎还不够。
我看到了一些示例,但他们使用的“完整”着色语言不适用于 Core Image,它是一种 subset,仅用于处理片段。
【问题讨论】:
标签: ios metal core-image cifilter metalkit