You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:24:02