如何在CIFilter自定义内核中获取sampler的归一化坐标
问题原因
Core Image 自定义Metal内核中,sampler的coord()方法默认返回的是输入图像的像素坐标,数值范围和图像实际像素尺寸一致,并非[0,1]区间的归一化坐标,你参考的早期教程使用的是未正式发布的测试版API特性,正式版API已经调整为返回像素坐标。
解决方法
你可以通过sampler的extent属性获取输入图像的尺寸,手动计算归一化坐标即可,另外注意你当前代码存在函数名笔误:你定义的函数名是multiplyColors,后续调用时少写了末尾的s,也会导致运行异常。
修正后的完整内核代码如下:
#include <metal_stdlib> using namespace metal; #include <CoreImage/CoreImage.h> float3 multiplyColors(float3, float3); float3 multiplyColors(float3 mainColor, float3 colorMultiplier) { float3 color = float3(0,0,0); color.r = mainColor.r * colorMultiplier.r; color.g = mainColor.g * colorMultiplier.g; color.b = mainColor.b * colorMultiplier.b; return color; }; extern "C" { namespace coreimage { float4 dyeInThree(sampler src, float3 redVector, float3 greenVector, float3 blueVector) { float2 pos = src.coord(); // 手动计算归一化坐标 float2 normPos = float2(pos.x / src.extent.size.width, pos.y / src.extent.size.height); float4 pixelColor = src.sample(pos); float3 pixelRGB = pixelColor.rgb; float3 color = float3(0,0,0); // 改用归一化坐标判断 if (normPos.y < 0.33) { color = multiplyColors(pixelRGB, redVector); } else if (normPos.y >= 0.33 && normPos.y < 0.66) { color = multiplyColors(pixelRGB, greenVector); } else { color = multiplyColors(pixelRGB, blueVector); } return float4(color, 1.0); } }}
内容的提问来源于stack exchange,提问作者Roman Gaditskii
相关产品推荐
相关产品推荐

