首页 > 解决方案 > 相当于 OpenGL 混合的金属

问题描述

我试图了解mix OpenGL金属中的功能等价物。这是OpenGL我要转换的代码:

float udRoundBox( vec2 p, vec2 b, float r )
{
    return length(max(abs(p)-b+r,0.0))-r;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // setup
    float t = 0.2 + 0.2 * sin(mod(iTime, 2.0 * PI) - 0.5 * PI);
    float iRadius = min(iResolution.x, iResolution.y) * (0.05 + t);
    vec2 halfRes = 0.5 * iResolution.xy;

    // compute box
    float b = udRoundBox( fragCoord.xy - halfRes, halfRes, iRadius );

    // colorize (red / black )
    vec3 c = mix( vec3(1.0,0.0,0.0), vec3(0.0,0.0,0.0), smoothstep(0.0,1.0,b) );

    fragColor = vec4( c, 1.0 );
} 

到目前为止,我能够转换其中的一部分:

float udRoundBox( float2 p, float2 b, float r )
{
    return length(max(abs(p)-b+r,0.0))-r;
}

float4 cornerRadius(sampler_h src) {

    float2 greenCoord = src.coord(); // this is alreay in relative coords; no need to devide by image size

    float t = 0.5;
    float iRadius = min(greenCoord.x, greenCoord.y) * (t);
    float2 halfRes = float2(greenCoord.x * 0.5, greenCoord.y * 0.5);

    float b = udRoundBox( float2(greenCoord.x - halfRes.x, greenCoord.y - halfRes.y), halfRes, iRadius );

    float3 c = mix(float3(1.0,0.0,0.0), float3(0.0,0.0,0.0), smoothstep(0.0,1.0,b) );

    return float4(c, 1.0);
}

但它正在产生绿屏。我正在尝试在这样的视频上实现圆角半径:

在此处输入图像描述

标签: iosswiftshadermetal

解决方案


混合函数是线性插值的一种实现,通常称为 Lerp 函数。

您可以在有值的地方使用线性插值,假设 t 并且您想知道该值如何在特定范围内映射。

例如,如果我有三个值:

a = 0 b = 1 和 t = 0.5

我可以调用 mix(a,b,t) ,结果是 0.5。这是因为 mix 函数需要一个起始范围值、一个结束范围值和一个插值因子,所以我得到 0.5,它介于 0 和 1 之间。

查看文档 Metal 有一个执行线性插值的 mix 实现。

在此处输入图像描述


推荐阅读