gpt4 book ai didi

ios - 具有自定义 Metal 内核的核心图像过滤器不起作用

转载 作者:行者123 更新时间:2023-11-28 13:28:10 25 4
gpt4 key购买 nike

我已经基于自定义内核制作了自定义 CIFilter,我无法使其正常工作,输出图像充满黑色,我不明白为什么。这是着色器:

// MARK: Custom kernels
float4 eight_bit(sampler image, sampler palette_image, float paletteSize) {
float4 color = image.sample(image.coord());
float dist = distance(color, palette_image.sample(float2(0,0)));
float4 returnColor = palette_image.sample(float2(0,0));
for (int i = 1; i < floor(paletteSize); ++i) {
float tempDist = distance(color, palette_image.sample(float2(i,0)));
if (tempDist < dist) {
dist = tempDist;
returnColor = palette_image.sample(float2(i,0));
}
}
return returnColor;
}

第一个采样器是需要详细说明的图像,第二个图像是包含必须在该图像中使用的特定调色板颜色的图像。
调色板图像是从 RGBA 值数组创建的,传递到 Data 缓冲区,并使用此 CIImage 初始化程序 init(bitmapData data: Data, bytesPerRow: Int,大小:CGSize,格式:CIFormat,颜色空间:CGColorSpace?)。图片的高度为 1px,宽度为 color 数量。图片获取正确,看起来是这样的:
Image from palette
尝试检查我发现的着色器:

  • 如果我返回color,我得到了原始图像,这意味着采样器image被正确传递
  • 如果我尝试从 palette_image 中的任何像素返回颜色,则滤镜生成的图像为黑色

我开始认为 palette_image 以某种方式未正确传递。这里图像是如何通过过滤器的:

 override var outputImage: CIImage? {
guard let inputImage = inputImage else
{
return nil
}
let palette = EightBitColorFilter.palettes[Int(0)]
let paletteImage = EightBitColorFilter.image(from: palette)
let extent = inputImage.extent
let pixellateImage = inputImage.applyingFilter("CIPixellate", parameters: [kCIInputScaleKey: inputScale])
// let sampler = CISampler(image: paletteImage)
let arguments = [pixellateImage, paletteImage, Float(palette.count)] as [Any]

let final = kernel.apply(extent: extent, roiCallback: {
(index, rect) in
return rect
}, arguments: arguments)

return final
}

最佳答案

您的采样坐标已关闭。

采样器在Core Image中使用相对坐标,即(0,0)对应左上角,(1,1)对应< em>整个输入图像。

所以尝试这样的事情:

float4 eight_bit(sampler image, sampler palette_image, float paletteSize) {
float4 color = image.sample(image.coord());
// initial offset to land in the middle of the first pixel
float2 firstPaletteCoord = float2(1.0 / (2.0 * palletSize), 0.5);
float dist = distance(color, palette_image.sample(firstPaletteCoord));
float4 returnColor = palette_image.sample(firstPaletteCoord);
for (int i = 1; i < floor(paletteSize); ++i) {
// step one pixel further
float2 paletteCoord = firstPaletteCoord + float2(1.0 / paletteSize, 0.0);
float4 paletteColor = palette_image.sample(paletteCoord);
float tempDist = distance(color, paletteColor);
if (tempDist < dist) {
dist = tempDist;
returnColor = paletteColor;
}
}
return returnColor;
}

关于ios - 具有自定义 Metal 内核的核心图像过滤器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57974103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com