Как использовать функцию smoothstep с использованием renderscript в Android

#android #masking #renderscript #smoothstep

#Android #маскировка #renderscript #плавный шаг

Вопрос:

Как мы можем использовать функцию smoothstep в renderscript, чтобы сгладить изображение маски (уже размытое с использованием gaussian blur с размером ядра 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 fragment shader:-

     float mask = btex.r;
    float maskValue = smoothstep(0.3, 0.5, mask);
    vec4 ress = vec4(maskValue,maskValue,maskValue,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 внутри, на случай, если у вас есть какие-либо другие сомнения:

плавный шаг

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

Комментарии:

1. Однако в следующих ссылках они упоминают о функциях smoothstep.. Возможно, в настоящее время они не реализованы в rs

2. Ссылка в ответе не связана с RenderScript, это просто ссылка с информацией о том, как работает общая функция smoothstep, на случай, если вы хотите написать свою собственную функцию. И, как указано в ответе, в RenderScript нет функции smoothstep, поэтому вы можете использовать ту, которую я ввел в ответ, которая представляет собой функцию smoothstep, написанную на 100% в RenderScript.