我做了这个例子来说明问题。它通过硬编码坐标从纹理中获取 1 个像素,并用作着色器中每个像素的结果。我希望所有图像都是相同的颜色。当图像很小时,它可以完美地工作,但是当我使用大图像时,它会产生奇怪的结果。例如,这里的图像大小为 7680x8580,您可以看到 4 个正方形:
这是我的代码
kernel vec4 colorKernel(sampler source)
{
vec4 key = sample(source, samplerTransform(source, vec2(100., 200.)));
return key;
}
这是我初始化内核的方式:
override var outputImage: CIImage? {
return colorFillKernel.apply(
extent: CGRect(origin: CGPoint.zero, size: inputImage!.extent.size),
roiCallback:
{
(index, rect) in
return rect
},
arguments: [
inputImage])
}
此外,此代码正确显示图像,没有更改和正方形:
vec2 dc = destCoord();
return sample(source, samplerTransform(source, dc));
在公共文档中,它说“Core Image 自动将大图像分割成较小的图块进行渲染,因此您的回调可能会被多次调用。” 但我找不到如何处理这种情况的方法。我有万花筒效果,并且从任何这个图块中我也需要能够从另一个图块中获取像素......