特效常用函数实例01

clip() step(a,x) lerp(a,b,x)
函数1,clip(value),用于消融,此方法比较节省性能消耗,value的值小于零则丢弃像素,否则保留,实例:

            float4 frag(VertexOutput i) : COLOR {

                float4 _Maintex_var = tex2D(_Maintex,TRANSFORM_TEX(i.uv0, _Maintex));
                //让贴图的透明通道减去一个变量,就能控制变量进行裁切贴图
                clip(_Maintex_var.a- _Cutoff);

                 return _Maintex_var;
            }

在这里插入图片描述
函数2: Step(a,x):如果x<a返回0;如果x>或=a返回1

lerp(a,b,x):线性插值函数,返回值为(1-x)a+bx


Shader "Shader Forge/test_lerp/step" {
    Properties {
        _Maintex ("Maintex", 2D) = "white" {}
        [HideInInspector]_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
        [hdr]_color01("color01",color)=(1,1,1,1)
        [hdr]_color02("color02",color)=(1,1,1,1)
        _colorCtl("color Ctrol",float)=0



    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase
          
            #pragma target 3.0
            uniform sampler2D _Maintex; uniform float4 _Maintex_ST;
            float4 _color01;
            float4 _color02;
            float _colorCtl;

            struct VertexInput {
                float4 vertex : POSITION;
                float2 texcoord0 : TEXCOORD0;
                float4 vertexColor : COLOR;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 vertexColor : COLOR;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.vertexColor = v.vertexColor;
                o.pos = UnityObjectToClipPos( v.vertex );
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
// Lighting:
// Emissive:
                float4 _Maintex_var = tex2D(_Maintex,TRANSFORM_TEX(i.uv0, _Maintex));
                //step(a,x)   可以用来做硬边效果
                float dissolveArea=step(0,(_Maintex_var.r+_colorCtl));
               //对dissolveArea进行颜色插值输出
                float3 finalColor=lerp(_color01.rgb,_color02.rgb,dissolveArea);
               
                return fixed4(finalColor,(_Maintex_var.a*i.vertexColor.a));
            }
            ENDCG
        }
    }

}

在这里插入图片描述函数3 frac(x) 对参数x只取小数部分,整数部分去掉,这个函数对于渲染重复性纹理的时候非常好用,比如我想制作一个全息的线条纹理,就可以把模型的坐标纹理i.uv.r进行frac(),当i.uv.r越大时,frac()的重复就越多:

Shader "Shader Forge/test" {
    Properties {
        _linectrol ("linectrol", Float ) = 0
        _LineTile ("LineTile", Range(0, 10)) = 6.384615
    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Blend SrcAlpha OneMinusSrcAlpha
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            uniform float _linectrol;
            uniform float _LineTile;
            struct VertexInput {
                float4 vertex : POSITION;
                float2 texcoord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.pos = UnityObjectToClipPos( v.vertex );
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
// Lighting:
// Emissive:
                float node_9370 = step(_linectrol,frac((i.uv0.r*_LineTile)));
                float3 emissive = float3(node_9370,node_9370,node_9370);
                float3 finalColor = emissive;
                return fixed4(finalColor,1);
            }
            ENDCG
        }
    }
}

在这里插入图片描述
函数4:不开启透明度混合alphablend,能不能让材质球产生半透明,这个可以用一个巧妙的方法,可以让grabtexture跟材质球的主题颜色进行一个插值,就可以在不开启半透明混合的情况下获得材质球的半透效果:缺点:这个会多一个屏幕采样pass

Shader "Shader Forge/test" {
    Properties {
        _MainTex ("MainTex", 2D) = "white" {}
    }
    SubShader {
        Tags {
            "IgnoreProjector"="True"
            "Queue"="Transparent"
            "RenderType"="Transparent"
        }
        GrabPass{ }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            Blend one zero
            ZWrite Off
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase
            #pragma only_renderers d3d9 d3d11 glcore gles 
            #pragma target 3.0
            uniform sampler2D _GrabTexture;
            uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
            struct VertexInput {
                float4 vertex : POSITION;
                float2 texcoord0 : TEXCOORD0;
            };
            struct VertexOutput {
                float4 pos : SV_POSITION;
                float2 uv0 : TEXCOORD0;
                float4 projPos : TEXCOORD1;
            };
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;
                o.uv0 = v.texcoord0;
                o.pos = UnityObjectToClipPos( v.vertex );
                o.projPos = ComputeScreenPos (o.pos);
                COMPUTE_EYEDEPTH(o.projPos.z);
                return o;
            }
            float4 frag(VertexOutput i) : COLOR {
                float2 sceneUVs = (i.projPos.xy / i.projPos.w);
                float4 sceneColor = tex2D(_GrabTexture, sceneUVs);
// Lighting:
                float4 _MainTex_var = tex2D(_MainTex,TRANSFORM_TEX(i.uv0, _MainTex));
                float3 finalColor = lerp(sceneColor.rgb,_MainTex_var.rgb,_MainTex_var.a);
                return fixed4(finalColor,1);
            }
            ENDCG
        }
    }

}

函数5:如何去色,把所采样的贴图进行去色处理:
将采样的纹理进行Dot点乘:y=dot(x,float3(0.3,0.59,0.11));
float3 color=float3(y,y,y);

函数6:parallax:原意为“视差”
函数7:
floor(value)函数
功能:把一个小数向下取整
可以实现类似于卡通效果的色彩分层效果

float3 emissive = floor(_Maintex.rgb*_numCtrol)/_numCtrol;

在这里插入图片描述
函数9:grabpass
函数10:天空盒子采样;

bump = normalize(half3(dot(i.TtoW0.xyz, bump), dot(i.TtoW1.xyz, bump), dot(i.TtoW2.xyz, bump)));
				fixed3 reflDir = reflect(-viewDir, bump);
				fixed3 reflCol = texCUBE(_Cubemap, reflDir).rgb * _Color.rgb;

函数11:saturate(x) (将x值规范到0~1之间)
当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值.),当然saturate也可以使用变量的swizzled版本,比如saturate(somecolor.rgb);
函数12:max(0,x) 输入x,if x<0,max=0;else,max=x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值