Unity&Shader常用函式的使用方法

搭建MrsFu123發表於2022-05-21



1、Step(a,x):如果x<a返回0;如果x>或=a返回1

2、Clamp(x,a,a):如果x<a返回a;如果x>b返回b;如果在a和b之間就返回x

3、smoothstep(min,max,x):返回的值為–2*(( min )/( max  min ))3 +3*(( min )/( max  min ))2

4、lerp(a,b,f):線性插值函式,返回值為(1-f)*a+b*f

5、三角函式sin、cos

二、常用函式的使用例項

1、Step函式,在中的Shader例項程式碼如下:

Shader "Unlit/Chapter5-Step"

{

        Properties

        {

                _background("背景色",Color)=(0,0,0,0)

        }

        SubShader

        {

                // No culling or depth

                Cull Off ZWrite Off ZTest Always

 

                CGINCLUDE

                ENDCG

 

 

        Pass

        {

                CGPROGRAM

                #pragma vertex vert

                #pragma fragment frag

 

                #include "UnityCG.cginc"

                float4 _background;

 

        struct appdata

        {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

        };

 

        struct v2f

        {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

        };

 

        v2f vert(appdata v)

        {

                v2f o;

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.uv;

                o.uv.y = 1 - o.uv.y;

                return o;

        }

 

        // Functions

        fixed4 frag(v2f i) : SV_Target

        {

                float2 r = 2.0*(i.uv - 0.5);

                //_ScreenParams是Unity內建的變數

                float aspectRatio = _ScreenParams.x / _ScreenParams.y;

                r.x *= aspectRatio;

 

                fixed3 pixel = _background.xyz;

                float edge, variable, ret;

 

                //將螢幕劃分成五個部分

 

                //第一部分

                if (r.x < -0.6*aspectRatio)

                {

                        variable = r.y;

                        edge = 0.2;

                        if (variable > edge)

                        {

                                ret = 1.0;

                        }

                        else

                        {

                                ret = 0;

                        }

                }

                else if (r.x < -0.2*aspectRatio)

                {

                        variable = r.y;

                        edge = -0.2;

                        //step(a,x):如果x<a結果返回0,反之返回1

                        ret = step(edge, variable);

                }

                else if (r.x < 0.2*aspectRatio)

                {

                        ret = 1.0 - step(0.5, r.y);

                }

                else if (r.x < 0.6*aspectRatio)

                {

                        ret = 0.3 + 0.5*step(-0.4, r.y);

                }

                else

                {

                        ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));

                }

                pixel = fixed3(ret, ret, ret);

                return fixed4(pixel, 1.0);

 

        }

  

                ENDCG

        }

        }

}


2、Clamp函式,在Unity中的Shader例項程式碼如下:


Shader "Unlit/Chapter5-Step"

{

        Properties

        {

                _background("背景色",Color)=(0,0,0,0)

        }

        SubShader

        {

                // No culling or depth

                Cull Off ZWrite Off ZTest Always

 

                CGINCLUDE

                ENDCG

 

 

        Pass

        {

                CGPROGRAM

                #pragma vertex vert

                #pragma fragment frag

 

                #include "UnityCG.cginc"

                float4 _background;

 

        struct appdata

        {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

        };

 

        struct v2f

        {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

        };

 

        v2f vert(appdata v)

        {

                v2f o;

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.uv;

                o.uv.y = 1 - o.uv.y;

                return o;

        }

 

        // Functions

        fixed4 frag(v2f i) : SV_Target

        {

                float2 r = 2.0*(i.uv - 0.5);

                //_ScreenParams是Unity內建的變數

                float aspectRatio = _ScreenParams.x / _ScreenParams.y;

                r.x *= aspectRatio;

 

                fixed3 pixel = _background.xyz;

                float edge, variable, ret;

 

                //將螢幕劃分成五個部分

 

                //第一部分

                if (r.x < -0.6*aspectRatio)

                {

                        variable = r.y;

                        edge = 0.2;

                        if (variable > edge)

                        {

                                ret = 1.0;

                        }

                        else

                        {

                                ret = 0;

                        }

                }

                else if (r.x < -0.2*aspectRatio)

                {

                        variable = r.y;

                        edge = -0.2;

                        //step(a,x):如果x<a結果返回0,反之返回1

                        ret = step(edge, variable);

                }

                else if (r.x < 0.2*aspectRatio)

                {

                        ret = 1.0 - step(0.5, r.y);

                }

                else if (r.x < 0.6*aspectRatio)

                {

                        ret = 0.3 + 0.5*step(-0.4, r.y);

                }

                else

                {

                        ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));

                }

                pixel = fixed3(ret, ret, ret);

                return fixed4(pixel, 1.0);

 

        }

 

 

                ENDCG

        }

        }

}

3、smoothstep,這個指令碼只給出片段著色器部分,其他部分同2,程式碼如下:

Shader "Unlit/Chapter5-Step"

{

        Properties

        {

                _background("背景色",Color)=(0,0,0,0)

        }

        SubShader

        {

                // No culling or depth

                Cull Off ZWrite Off ZTest Always

 

                CGINCLUDE

                ENDCG

 

 

        Pass

        {

                CGPROGRAM

                #pragma vertex vert

                #pragma fragment frag

 

                #include "UnityCG.cginc"

                float4 _background;

 

        struct appdata

        {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

        };

 

        struct v2f

        {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

        };

 

        v2f vert(appdata v)

        {

                v2f o;

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.uv;

                o.uv.y = 1 - o.uv.y;

                return o;

        }

 

        // Functions

        fixed4 frag(v2f i) : SV_Target

        {

                float2 r = 2.0*(i.uv - 0.5);

                //_ScreenParams是Unity內建的變數

                float aspectRatio = _ScreenParams.x / _ScreenParams.y;

                r.x *= aspectRatio;

 

                fixed3 pixel = _background.xyz;

                float edge, variable, ret;

 

                //將螢幕劃分成五個部分

 

                //第一部分

                if (r.x < -0.6*aspectRatio)

                {

                        variable = r.y;

                        edge = 0.2;

                        if (variable > edge)

                        {

                                ret = 1.0;

                        }

                        else

                        {

                                ret = 0;

                        }

                }

                else if (r.x < -0.2*aspectRatio)

                {

                        variable = r.y;

                        edge = -0.2;

                        //step(a,x):如果x<a結果返回0,反之返回1

                        ret = step(edge, variable);

                }

                else if (r.x < 0.2*aspectRatio)

                {

                        ret = 1.0 - step(0.5, r.y);

                }

                else if (r.x < 0.6*aspectRatio)

                {

                        ret = 0.3 + 0.5*step(-0.4, r.y);

                }

                else

                {

                        ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));

                }

                pixel = fixed3(ret, ret, ret);

                return fixed4(pixel, 1.0);

 

        }

 

 

                ENDCG

        }

        }

4、lerp函式,Unity中的Shader程式碼如下:

Shader "Unlit/Chapter5-Step"

{

        Properties

        {

                _background("背景色",Color)=(0,0,0,0)

        }

        SubShader

        {

                // No culling or depth

                Cull Off ZWrite Off ZTest Always

 

                CGINCLUDE

                ENDCG

 

 

        Pass

        {

                CGPROGRAM

                #pragma vertex vert

                #pragma fragment frag

 

                #include "UnityCG.cginc"

                float4 _background;

 

        struct appdata

        {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

        };

 

        struct v2f

        {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

        };

 

        v2f vert(appdata v)

        {

                v2f o;

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.uv;

                o.uv.y = 1 - o.uv.y;

                return o;

        }

 

        // Functions

        fixed4 frag(v2f i) : SV_Target

        {

                float2 r = 2.0*(i.uv - 0.5);

                //_ScreenParams是Unity內建的變數

                float aspectRatio = _ScreenParams.x / _ScreenParams.y;

                r.x *= aspectRatio;

 

                fixed3 pixel = _background.xyz;

                float edge, variable, ret;

 

                //將螢幕劃分成五個部分

 

                //第一部分

                if (r.x < -0.6*aspectRatio)

                {

                        variable = r.y;

                        edge = 0.2;

                        if (variable > edge)

                        {

                                ret = 1.0;

                        }

                        else

                        {

                                ret = 0;

                        }

                }

                else if (r.x < -0.2*aspectRatio)

                {

                        variable = r.y;

                        edge = -0.2;

                        //step(a,x):如果x<a結果返回0,反之返回1

                        ret = step(edge, variable);

                }

                else if (r.x < 0.2*aspectRatio)

                {

                        ret = 1.0 - step(0.5, r.y);

                }

                else if (r.x < 0.6*aspectRatio)

                {

                        ret = 0.3 + 0.5*step(-0.4, r.y);

                }

                else

                {

                        ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));

                }

                pixel = fixed3(ret, ret, ret);

                return fixed4(pixel, 1.0);

 

        }

                 ENDCG

        }

        }

}

5、lerp函式與直接的顏色加減進行對比:完整的Shader程式碼如下:

Shader "Unlit/Chapter5-Step"

{

        Properties

        {

                _background("背景色",Color)=(0,0,0,0)

        }

        SubShader

        {

                // No culling or depth

                Cull Off ZWrite Off ZTest Always

 

                CGINCLUDE

                ENDCG

 

 

        Pass

        {

                CGPROGRAM

                #pragma vertex vert

                #pragma fragment frag

 

                #include "UnityCG.cginc"

                float4 _background;

 

        struct appdata

        {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

        };

 

        struct v2f

        {

                float2 uv : TEXCOORD0;

                float4 vertex : SV_POSITION;

        };

 

        v2f vert(appdata v)

        {

                v2f o;

                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

                o.uv = v.uv;

                o.uv.y = 1 - o.uv.y;

                return o;

        }

 

        // Functions

        fixed4 frag(v2f i) : SV_Target

        {

                float2 r = 2.0*(i.uv - 0.5);

                //_ScreenParams是Unity內建的變數

                float aspectRatio = _ScreenParams.x / _ScreenParams.y;

                r.x *= aspectRatio;

 

                fixed3 pixel = _background.xyz;

                float edge, variable, ret;

 

                //將螢幕劃分成五個部分

 

                //第一部分

                if (r.x < -0.6*aspectRatio)

                {

                        variable = r.y;

                        edge = 0.2;

                        if (variable > edge)

                        {

                                ret = 1.0;

                        }

                        else

                        {

                                ret = 0;

                        }

                }

                else if (r.x < -0.2*aspectRatio)

                {

                        variable = r.y;

                        edge = -0.2;

                        //step(a,x):如果x<a結果返回0,反之返回1

                        ret = step(edge, variable);

                }

                else if (r.x < 0.2*aspectRatio)

                {

                        ret = 1.0 - step(0.5, r.y);

                }

                else if (r.x < 0.6*aspectRatio)

                {

                        ret = 0.3 + 0.5*step(-0.4, r.y);

                }

                else

                {

                        ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));

                }

                pixel = fixed3(ret, ret, ret);

                return fixed4(pixel, 1.0);

 

        }

 

 

                ENDCG

        }

        }

}



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009264/viewspace-2895896/,如需轉載,請註明出處,否則將追究法律責任。

相關文章