Metal Shader中CIKernel的图像裁剪异常问题求助
胶片画框效果Metal Shader裁剪异常问题
我正在开发一个实现胶片画框效果的Metal Shader,代码如下:
extern "C" { namespace coreimage { float4 reassemble(sampler source, sampler frame, float imgWidth, float perFrameSize, float epsilon, destination dest) { float2 coord = dest.coord(); float4 srcExtent = source.extent(); float4 pixel = float4(0, 1, 0, 1); float sideFrameSize = epsilon + (imgWidth - srcExtent.z)/2 - perFrameSize; float offset = sideFrameSize + perFrameSize - epsilon; if (coord.x < sideFrameSize) { pixel = source.sample(source.transform(float2(coord.x + srcExtent.x + srcExtent.z - sideFrameSize, coord.y))); } else if (coord.x >= offset && coord.x <= srcExtent.z + offset) { pixel = source.sample(source.transform(float2(coord.x + srcExtent.x - offset, coord.y))); } else if (coord.x >= srcExtent.z + offset + perFrameSize - epsilon) { pixel = source.sample(source.transform(float2(coord.x + srcExtent.x - srcExtent.z - offset - perFrameSize + epsilon, coord.y))); } float4 framePixel = frame.sample(frame.transform(coord)); return mix(pixel, framePixel, framePixel.a); } } }
该Shader运行正常,能生成目标胶片画框效果。但在集成裁剪步骤到处理管线时出现异常:
- 在调用Kernel函数前对源图像裁剪,结果正常;
- 对Kernel输出的图像执行裁剪时,实际是源图像先被裁剪,再执行Shader处理,导致效果异常。
相关Swift调用代码如下:
if let source = self.kernel.apply(extent: frameImage.extent, roiCallback: { _, rect -> CGRect in return rect }, arguments: [scaled.transformed(by: .init(translationX: 0, y: perFrameWidth - vOffset)), frameImage, image.extent.width, perFrameWidth, hOffset]) { return source.cropped(to: frameImage.extent.insetBy(dx: 80, dy: 200)) }
参考图像说明
- 原始图像:未经过任何处理的输入图
- 正常效果:Shader输出的未裁剪胶片画框效果
- 异常效果:对Shader输出裁剪后得到的错误结果,源图像被提前裁剪导致画框效果错位
我没有直接裁剪传入Shader的源图像,仅对Shader输出执行裁剪,但源图像却被提前裁剪。需要修改逻辑,确保裁剪仅作用于Shader的输出图像,而非源图像,求解决方案。
内容的提问来源于stack exchange,提问作者Oleksandr Fedko
相关产品推荐
相关产品推荐

