1

我们如何使用 renderscript 中的 smoothstep 函数来平滑蒙版图像(已经使用内核大小为 3 或 5 的高斯模糊进行模糊)并使其边缘更平滑。我在其他框架中尝试了以下代码,它们按预期工作。

iOS着色器代码:-

let kernelStr = """
            kernel vec4 myColor(__sample source) {
                float maskValue = smoothstep(0.3, 0.5, source.r);
                return vec4(maskValue,maskValue,maskValue,1.0);
            }
        """

在 opengl glsl 片段着色器中:-

    float mask = btex.r;
    float maskValue = smoothstep(0.3, 0.5, mask);
    vec4 ress = vec4(maskValue,maskValue,maskValue,1.0);
4

1 回答 1

3

RenderScript没有内置的smoothstep函数,所以最简单的就是自己实现。接下来准备在您的脚本中使用的源代码:

static inline float smoothstep(float edge0, float edge1, float x)
{
    float value = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
    return value * value * (3.0f - 2.0f * value);
}

使用示例:

static inline float smoothstep(float edge0, float edge1, float x)
{
    float value = clamp((x - edge0) / (edge1 - edge0), 0.0f, 1.0f);
    return value * value * (3.0f - 2.0f * value);
}

uchar4 RS_KERNEL root(uint32_t x, uint32_t y)
{
      ....
      float mask = btex.r;
      float maskValue = smoothstep(0.3f, 0.5f, mask);
      float4 ress = (float4){maskValue, maskValue, maskValue, 1.0f};
      ....
}

接下来是关于 smoothstep 内部工作原理的链接,以防您有任何其他疑问:

平滑步

享受

于 2019-03-27T19:29:44.347 回答