• Unity Shader (四)片段程序示例


     

    1、环境光+漫反射+高光+点光源

    Shader "Custom/Example_Frag_1" {
        properties
        {
            _MainColor("Main Color",color)=(1,1,1,1)
            _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色
            _Shininess("Shininess",range(1,32))=8 //高光范围
        }
        Subshader
        {
            pass{
                tags{"LightMode"="Forwardbase"}
    
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
                #include "lighting.cginc"
    
                float4 _MainColor;
                float4 _SpecularColor;
                float _Shininess;
    
                struct v2f
                {
                    float4 pos:POSITION;
                    float3 normal:TEXCOORD1;
                    fixed4 vertex:COLOR;
                };
    
    
                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.normal=v.normal;
                    o.vertex=v.vertex;
                    return o;
                }
                float4 frag(v2f IN):COLOR
                {
                    //Ambinet color 环境光
                    fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
    
                    //Diffuse Color 漫反射光 dot(N,L)
                    float3 N=UnityObjectToWorldNormal(IN.normal);
                    float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                    float diffuseScale=saturate(dot(N,L));
                    col+=_LightColor0*_MainColor*diffuseScale;
    
                    //Specular Color 高光
                    float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                    float3 R=2*dot(N,L)*N-L;//反射光,方案一
    //                float3 I=-WorldSpaceLightDir(IN.vertex);
    //                float3 R=reflect(I,N);//反射光,方案二
                    float specularScale=saturate(dot(R,V));
                    col+=_SpecularColor*pow(specularScale,_Shininess);
    
                    //compute 4 points lighting 点光源
                    float3 wpos=mul(_Object2World,IN.vertex).xyz;
                    col.rgb+=Shade4PointLights
                    (
                        unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                        unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
                        unity_4LightAtten0,
                        wpos,N
                    );
                    return col;//漫反射+环境光
                }
    
                ENDCG
            }
        }
    }

     2、阴影

    Shader "Custom/Example_Frag_2" {
        properties
        {
            _MainColor("Main Color",color)=(1,1,1,1)
            _SpecularColor("Specular Color",color)=(1,1,1,1) //高光颜色
            _Shininess("Shininess",range(1,32))=8 //高光范围
        }
        Subshader
        {
    
    //        pass
    //        {
    //            tags{"LightMode"="shadowcaster"}//这种方式只能为方向光添加投射阴影
    //        }
    
            pass{
                tags{"LightMode"="Forwardbase"}
    
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
                #include "lighting.cginc"
    
                float4 _MainColor;
                float4 _SpecularColor;
                float _Shininess;
    
                struct v2f
                {
                    float4 pos:POSITION;
                    float3 normal:TEXCOORD1;
                    fixed4 vertex:COLOR;
                };
    
    
                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.normal=v.normal;
                    o.vertex=v.vertex;
                    return o;
                }
                float4 frag(v2f IN):COLOR
                {
                    //Ambinet color 环境光
                    fixed4 col=UNITY_LIGHTMODEL_AMBIENT;
    
                    //Diffuse Color 漫反射光 dot(N,L)
                    float3 N=UnityObjectToWorldNormal(IN.normal);
                    float3 L=normalize(WorldSpaceLightDir(IN.vertex));
                    float diffuseScale=saturate(dot(N,L));
                    col+=_LightColor0*_MainColor*diffuseScale;
    
                    //Specular Color 高光
                    float3 V=normalize(WorldSpaceViewDir(IN.vertex));
                    float3 R=2*dot(N,L)*N-L;//反射光,方案一
    //                float3 I=-WorldSpaceLightDir(IN.vertex);
    //                float3 R=reflect(I,N);//反射光,方案二
                    float specularScale=saturate(dot(R,V));
                    col+=_SpecularColor*pow(specularScale,_Shininess);
    
                    //compute 4 points lighting 点光源
                    float3 wpos=mul(unity_ObjectToWorld,IN.vertex).xyz;
                    col.rgb+=Shade4PointLights
                    (
                        unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
                        unity_LightColor[0].rgb,unity_LightColor[1].rgb,unity_LightColor[2].rgb,unity_LightColor[3].rgb,
                        unity_4LightAtten0,
                        wpos,N
                    );
                    return col;//漫反射+环境光
                }
    
                ENDCG
            }
        }
        //取巧的方法是,让其回滚到系统自带的Diffuse中,
        //这样既可以产生方向光阴影,点光源也可以产生阴影
        fallback "Diffuse"
    }

     3、镂空效果

    Subshader
        {
            Tags{"Queue"="Transparent"}
            pass{
                blend srcAlpha oneMinussrcalpha
           zwrite off CGPROGRAM
    #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" float _Scale; struct v2f { float4 pos:POSITION; float3 normal:TEXCOORD0; fixed4 vertex:TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; o.pos=UnityObjectToClipPos(v.vertex); o.normal=v.normal; o.vertex=v.vertex; return o; } float4 frag(v2f IN):COLOR { float3 N=UnityObjectToWorldNormal(IN.normal); float3 V=UnityWorldSpaceViewDir(IN.vertex); float bright=1.0-saturate(dot(N,V)); bright=pow(bright,_Scale); return fixed4(1,1,1,1)*bright; } ENDCG } } }

     4、描边

    Shader "Custom/Example_Frag_4" {
        properties
        {
            _MainColor("MainColor",color)=(1,1,1,1)
            _Scale("Scale",range(1,8))=2
            _Outer("Outer",range(0,1))=0.2
        }
        Subshader
        {
            Tags{"Queue"="Transparent"}
            pass{
                blend srcAlpha oneMinussrcalpha
                zwrite off
    
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
    
                float4 _MainColor;
                float _Scale;
                float _Outer;
    
                struct v2f
                {
                    float4 pos:POSITION;
                    float3 normal:TEXCOORD0;
                    fixed4 vertex:TEXCOORD1;
                };
    
    
                v2f vert(appdata_base v)
                {
                    v.vertex.xyz+=v.normal*_Outer;
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.normal=v.normal;
                    o.vertex=v.vertex;
                    return o;
                }
                float4 frag(v2f IN):COLOR
                {
                    float3 N=UnityObjectToWorldNormal(IN.normal);
                    float3 V=UnityWorldSpaceViewDir(IN.vertex);
                    float bright=saturate(dot(N,V));
                    bright=pow(bright,_Scale);
                    _MainColor.a*=bright;
                    return _MainColor;
                }
    
                ENDCG
            }
        
        pass{
                blendop revsub
                blend dstalpha one
                zwrite off
    
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
    
                struct v2f
                {
                    float4 pos:POSITION;
                };
    
    
                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    return o;
                }
                float4 frag(v2f IN):COLOR
                {
                    return fixed4(1,1,1,1);
                }
    
                ENDCG
            }
        
            pass{
                blend srcAlpha oneMinussrcalpha
                zwrite off
    
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
    
                float _Scale;
    
                struct v2f
                {
                    float4 pos:POSITION;
                    float3 normal:TEXCOORD0;
                    fixed4 vertex:TEXCOORD1;
                };
    
    
                v2f vert(appdata_base v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.normal=v.normal;
                    o.vertex=v.vertex;
                    return o;
                }
                float4 frag(v2f IN):COLOR
                {
                    float3 N=UnityObjectToWorldNormal(IN.normal);
                    float3 V=UnityWorldSpaceViewDir(IN.vertex);
                    float bright=saturate(dot(N,V));
                    bright=pow(bright,_Scale);
                    return fixed4(1,1,1,1)*bright;
                }
    
                ENDCG
            }
        }
    
    }

     5、贴图及光照贴图

    Shader "Custom/Example_Frag_6" {
        Properties {
            _MainTex ("Albedo (RGB)", 2D) = "white" {}
        }
        SubShader {
            pass{
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
    
                sampler2D _MainTex;
                float4 _MainTex_ST;
    
                struct v2f{
                    float4 pos:POSITION;
                    float2 uv:TEXCOORD0;
                    float2 uv_lighting:TEXCOORD1;
                };
                v2f vert(appdata_full v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);//让属性面板中的Tiling和Offset起作用,这里需要声明 _ST 后缀的变量,这里是_MainTex_ST
                    o.uv_lighting=v.texcoord1.xy*unity_LightmapST.xy+unity_LightmapST.zw;//使用光照贴图
                    return o;
    
                }
                fixed4 frag(v2f IN):COLOR
                {
                    float3 lm=DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap,IN.uv_lighting));//解码光照贴图
                    fixed4 color=tex2D(_MainTex,IN.uv);
                    color.rgb*=lm;
                    return color;
                }
                ENDCG
            }
        }
    }

     6、波

    Shader "Custom/Example_Frag_7" {
        Properties {
            _MainTex ("Albedo (RGB)", 2D) = "white" {}
            _F("F",range(1,30))=10
            _A("A",range(0,0.1))=0.01
            _R("R",range(0,1))=0
        }
        SubShader {
            pass{
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
    
                sampler2D _MainTex;
                float4 _MainTex_ST;
                float _F;
                float _A;
                float _R;
    
                struct v2f{
                    float4 pos:POSITION;
                    float2 uv:TEXCOORD0;
                };
                v2f vert(appdata_full v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                    return o;
    
                }
                fixed4 frag(v2f IN):COLOR
                {
    //                IN.uv+=0.01*sin(IN.uv*3.14*_F+_Time.y);//水波
    
                    float2 uv=IN.uv;
                    float dis=distance(uv,float2(0.5,0.5));
                    float scale=0;
                    _A*=saturate(1-dis/_R);
                    scale=_A*sin(-dis*3.14*_F+_Time.y);//圆形涟漪
                    uv=uv+uv*scale;
                    fixed4 color=tex2D(_MainTex,uv);
                    return color;
                }
                ENDCG
            }
        }
    }

     7、模糊

    Shader "Custom/Example_Frag_8" {
        Properties {
            _MainTex ("Albedo (RGB)", 2D) = "white" {}
            _F("F",range(1,30))=10
            _A("A",range(0,0.1))=0.01
            _R("R",range(0,1))=0
        }
        SubShader {
            pass{
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "unitycg.cginc"
                #pragma target 3.0
                sampler2D _MainTex;
                float4 _MainTex_ST;
                float _F;
                float _A;
                float _R;
    
                struct v2f{
                    float4 pos:POSITION;
                    float2 uv:TEXCOORD0;
                    float z:TEXCOORD1;
                };
                v2f vert(appdata_full v)
                {
                    v2f o;
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                    o.z=mul(unity_ObjectToWorld,v.vertex).z;
                    return o;
    
                }
                fixed4 frag(v2f IN):COLOR
                {
                    float2 dsdx=ddx(IN.z)*10;
                    float2 dsdy=ddy(IN.z)*10;
                    fixed4 color=tex2D(_MainTex,IN.uv,dsdx,dsdy);//越正对的面越清晰,背对着的面模糊
                    return color;
                }
                ENDCG
            }
        }
    }
  • 相关阅读:
    preprocess
    数组
    共用体
    动态内存管理函数
    C链表
    文件的定位与出错检查
    字符串读写函数
    C文件操作
    位运算
    爱好-超级IP:超级IP
  • 原文地址:https://www.cnblogs.com/Jason-c/p/8558132.html
Copyright © 2020-2023  润新知