Metal CIKernel采样结果异常,出现条纹噪点求助
问题分析与解决:CIKernel采样相邻像素出现条纹噪点
核心问题是你混淆了纹理坐标和像素坐标:
- CIKernel中
sampler.coord()返回的是归一化纹理坐标,范围是[0, 1](对应图像从左上角到右下角),不是以像素为单位的绝对坐标 - 直接对坐标加
1.0会让x坐标超出有效采样范围,触发采样器的循环/截断行为,最终出现条纹噪点
修正方案
需要先获取纹理的像素尺寸,计算单个像素对应的纹理坐标增量,再用这个增量偏移坐标:
extern "C" float4 Simple(coreimage::sampler s) { // 获取纹理的像素宽高 float2 textureSize = s.size(); // 计算单个像素在x方向的纹理坐标增量 float2 pixelStep = float2(1.0 / textureSize.x, 0.0); float2 current = s.coord(); float2 anotherCoord = current + pixelStep; // 可选:限制坐标在有效范围内,避免边缘采样异常 anotherCoord = clamp(anotherCoord, float2(0.0), float2(1.0)); float4 sample = s.sample(anotherCoord); return sample; }
补充说明
s.size()返回当前采样纹理的实际像素尺寸(比如1920x1080的图像会返回(1920.0, 1080.0))- 若要采样上下相邻像素,只需修改
pixelStep的y分量,比如float2(0.0, 1.0 / textureSize.y) - 即使不限制坐标范围,采样器默认会循环采样超出范围的坐标,这也是你之前看到条纹的原因
内容的提问来源于stack exchange,提问作者jefflovejapan
相关产品推荐
相关产品推荐

