SpriteRenderer的Shader实现Image的Fil

作者: 暗夜初上 | 来源:发表于2017-06-22 15:03 被阅读640次

    本Shader基于unity5.4.4的SpriteDefault

    1、首先说一下原理

    因为UV是0-1之间的值,可以根据UV点的位置判断当前点是否显示,Horizontal根据x的值和FillAmount比较,比FillAmount小的显示,比FillAmount大的不显示,如图2当FillAmount为0.5时左侧显示,右侧的不显示。Vertical则根据y进行比较

    (图1) (图2)

    2、具体介绍Shader实现

    首先增加三个属性,可以让你外部修改属性的值

    Properties

    {

    ……

    ///1:横向;2:纵向;

    _FillMethod ("FillMethod", Int) = 1

    //1Method(1:从左到右显示;2:从右到左显示)

    //2Method(1:从下到上显示;2:从上到下显示)

    _FillOrigin ("FillOrigin", Int) = 1

    _FillAmount ("FillAmount", Range(0,1)) = 1

    }

    为了能再CG代码中使用这三个声明的属性,我们还要再代码中提前定义三个变量

    Pass

    {

    fixed4 _Color;

    int _FillMethod;

    int _FillOrigin;

    fixed _FillAmount;

    }

    fixed4 SampleSpriteTexture (float2 uv)

    {

    ///这句话的理解,取得_MainTex(要显示的图片)上的uv(当前点)点处的颜色值

    fixed4 color = tex2D (_MainTex, uv);

    #if ETC1_EXTERNAL_ALPHA

    // get the color from an external texture (usecase: Alpha support for ETC1 on android)

    color.a = tex2D (_AlphaTex, uv).r;

    #endif //ETC1_EXTERNAL_ALPHA

    if(1 == _FillMethod)

    {

    if(1 == _FillOrigin && uv.x>_FillAmount)

    {

    discard;

    }

    else if(2 == _FillOrigin && uv.x<(1-_FillAmount))

    {

    discard;

    }

    }

    else if(2 == _FillMethod)

    {

    if(1 == _FillOrigin && uv.y>_FillAmount)

    {

    discard;

    }

    else if(2 == _FillOrigin && uv.y<(1-_FillAmount))

    {

    discard;

    }

    }

    return color;

    }


    最后附上完整Shader文件

    相关文章

      网友评论

        本文标题:SpriteRenderer的Shader实现Image的Fil

        本文链接:https://www.haomeiwen.com/subject/herfcxtx.html