AndroidはShaderベースの画像処理(10)-ジグルバリ特効
1355 ワード
完全コード表示#Android ShaderDemoの下にあるBurrRender
ジグルバリ効果は、ピクセル値がX軸(横方向)に一定の距離だけずれ、カラーオフセットの2つの部分から構成されます.ここでは、X軸における画素のオフセットのみを模倣する.すべての画素がX軸にシフトするわけではありません.すべての画素がシフトすると、画像全体が横方向に移動するので、実際の効果はY軸上である行の画素をランダムに選択して横方向に移動することです.
ここではランダム関数を使用します.shaderでは次のランダム関数を使用できます.
この関数の原理については、ここを参照してください.
ランダム関数があり、完全なfragment shaderは以下の通りです.
まず,Y軸を基準とした乱数rangeを乱数関数で生成し,[−1,1]の範囲で,その後この値で左右にシフトできる.Y軸の行全体のオフセットが一部しかないため、willOffsetで行がオフセットされているかどうかを表します.乱数rangeと0.5を比較し、比較結果stepに基づいて0または1を返します.最後にoffsetはオフセット値を表し、uBurrParamは以前の特効と同様に、フレームごとのインデックスに関係してアニメーション効果を生成します.0.13は、値が大きいほどオフセットが多くなるように変更できます.
最終的な効果は次のとおりです.
burr.gif
ジグルバリ効果は、ピクセル値がX軸(横方向)に一定の距離だけずれ、カラーオフセットの2つの部分から構成されます.ここでは、X軸における画素のオフセットのみを模倣する.すべての画素がX軸にシフトするわけではありません.すべての画素がシフトすると、画像全体が横方向に移動するので、実際の効果はY軸上である行の画素をランダムに選択して横方向に移動することです.
ここではランダム関数を使用します.shaderでは次のランダム関数を使用できます.
float nrand(in float x, in float y)
{
return fract(sin(dot(vec2(x, y), vec2(12.9898, 78.233))) * 43758.5453);
}
この関数の原理については、ここを参照してください.
ランダム関数があり、完全なfragment shaderは以下の通りです.
precision mediump float;
uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;
uniform float uBurrParam;
float nrand(in float x, in float y)
{
return fract(sin(dot(vec2(x, y), vec2(12.9898, 78.233))) * 43758.5453);
}
void main()
{
float cx = v_TextureCoordinates.x;
float cy = v_TextureCoordinates.y;
float range = nrand(0, cy) * 2.0 - 1;
float willOffset = step(0.5, abs(range));
float offset = range * willOffset * 0.13 * uBurrParam;
gl_FragColor = texture2D(u_TextureUnit, fract(vec2(cx + offset, cy)));
}
まず,Y軸を基準とした乱数rangeを乱数関数で生成し,[−1,1]の範囲で,その後この値で左右にシフトできる.Y軸の行全体のオフセットが一部しかないため、willOffsetで行がオフセットされているかどうかを表します.乱数rangeと0.5を比較し、比較結果stepに基づいて0または1を返します.最後にoffsetはオフセット値を表し、uBurrParamは以前の特効と同様に、フレームごとのインデックスに関係してアニメーション効果を生成します.0.13は、値が大きいほどオフセットが多くなるように変更できます.
最終的な効果は次のとおりです.
burr.gif