Как использовать функцию сглаживания, используя Renderscript в Android - PullRequest
0 голосов
/ 27 марта 2019

Как мы можем использовать функцию сглаживания в Renderscript, чтобы сгладить изображение маски (уже размытое с помощью гауссова размытия с размером ядра 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 Ответ

1 голос
/ 27 марта 2019

RenderScript не имеет встроенной функции плавного перехода, поэтому самое простое - реализовать ее самостоятельно. Далее источник готов к использованию в ваших скриптах:

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

Наслаждайтесь

...