如何在Android中使用renderscript使用Smoothstep函数

时间:2019-03-27 19:17:36

标签: android masking 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);

1 个答案:

答案 0 :(得分:1)

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

享受