Skip to content

Instantly share code, notes, and snippets.

@stilllisisi
Last active March 13, 2020 10:03
Show Gist options
  • Save stilllisisi/d7dd628a6565a2edd4c0611b9b048ca6 to your computer and use it in GitHub Desktop.
Save stilllisisi/d7dd628a6565a2edd4c0611b9b048ca6 to your computer and use it in GitHub Desktop.

Revisions

  1. stilllisisi revised this gist Mar 11, 2020. 1 changed file with 203 additions and 200 deletions.
    403 changes: 203 additions & 200 deletions LightTrail.shader
    Original file line number Diff line number Diff line change
    @@ -8,79 +8,82 @@

    //源代码:
    Shader"QQ/LightTrail"
    {
    {
    Properties
    {
    {
    //_FrontColor("FrontColor",Color)=(0.5,0.5,0.5,1)
    _BackColor("BackColor",Color)=(0,0,0,1)
    _LightColor("LightColor",Color)=(1,1,0,1)
    _MainTex("Texture",2D)="white"{}
    _MainTex("Texture",2D)="white"{}
    _SmoothRange("SmoothRange",Range(0,20))=1
    _TrailColor("TrailColor",Color)=(0,0,0,1)
    _TrailPower("TrailPower",Range(0,10))=2
    _TrailLength("TrailLength",Range(0,500))=100
    }
    SubShader
    {
    Tags{"RenderType"="Transparent"
    "Queue"="Transparent"}
    }
    SubShader
    {
    Tags
    {
    "RenderType"="Transparent"
    "Queue"="Transparent"
    }
    LOD100
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    }
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    ZWriteOff
    CullOff
    BlendSrcAlphaOneMinusSrcAlpha
    @@ -90,145 +93,145 @@ Shader"QQ/LightTrail"
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    }
    Pass
    {
    BlendOneOne
    Tags{"LightMode"="ForwardAdd"}
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    {
    BlendOneOne
    Tags{"LightMode"="ForwardAdd"}
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    Pass
    {
    Tags{"LightMode"="ForwardAdd"}
    ZWriteOff
    CullOff
    BlendSrcAlphaOneMinusSrcAlpha
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    }
    }
    {
    Tags{"LightMode"="ForwardAdd"}
    ZWriteOff
    CullOff
    BlendSrcAlphaOneMinusSrcAlpha
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    }
    }
  2. stilllisisi renamed this gist Mar 11, 2020. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. stilllisisi created this gist Mar 11, 2020.
    234 changes: 234 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,234 @@
    //思路:
    //1.为了投影出体积阴影,我们多用一个pass来渲染网格。
    //2.网格延伸的方向是灯光的方向。
    //3.我们将顶点转换到模型空间,然后计算和灯光的角度进行顶点的偏移。
    //4.因为根据顶点偏移,所以不能对断开的顶点进行平滑的过度。
    //5.通过点乘插值我们来决定颜色的插值。
    //6.该shader不仅可以用来做体积投影,也可以在灯光下做体积光。

    //源代码:
    Shader"QQ/LightTrail"
    {
    Properties
    {
    //_FrontColor("FrontColor",Color)=(0.5,0.5,0.5,1)
    _BackColor("BackColor",Color)=(0,0,0,1)
    _LightColor("LightColor",Color)=(1,1,0,1)
    _MainTex("Texture",2D)="white"{}
    _SmoothRange("SmoothRange",Range(0,20))=1
    _TrailColor("TrailColor",Color)=(0,0,0,1)
    _TrailPower("TrailPower",Range(0,10))=2
    _TrailLength("TrailLength",Range(0,500))=100
    }
    SubShader
    {
    Tags{"RenderType"="Transparent"
    "Queue"="Transparent"}
    LOD100
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    Pass
    {
    Tags{"LightMode"="ForwardBase"}
    ZWriteOff
    CullOff
    BlendSrcAlphaOneMinusSrcAlpha
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    Pass
    {
    BlendOneOne
    Tags{"LightMode"="ForwardAdd"}
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float2uv:TEXCOORD0;
    float3normal:NORMAL;
    };
    structv2f
    {
    float2uv:TEXCOORD0;
    float4vertex:SV_POSITION;
    float4wPos:TEXCOORD1;
    UNITY_FOG_COORDS(2)
    float3normal:TEXCOORD3;
    float2uv_mask:TEXCOORD4;
    };
    uniformfloat4_LightColor0;
    //fixed4_FrontColor;
    fixed4_BackColor;
    fixed4_LightColor;
    sampler2D_MainTex;
    float4_MainTex_ST;
    float_SmoothRange;
    v2fvert(a2vv)
    {
    v2fo;
    o.vertex=mul(UNITY_MATRIX_MVP,v.vertex);
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    _MainTex_ST.zw*=_Time.x;
    o.uv=TRANSFORM_TEX(v.uv,_MainTex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=tex2D(_MainTex,i.uv);
    float_front=saturate(nor*_SmoothRange);
    col*=lerp(_BackColor,_LightColor0,_front);
    col+=_LightColor*min(1-_front,col.a);
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    Pass
    {
    Tags{"LightMode"="ForwardAdd"}
    ZWriteOff
    CullOff
    BlendSrcAlphaOneMinusSrcAlpha
    CGPROGRAM
    #pragmavertexvert
    #pragmafragmentfrag
    #pragmamulti_compile_fog
    #include"UnityCG.cginc"
    structa2v
    {
    float4vertex:POSITION;
    float3normal:NORMAL;
    };
    structv2f
    {
    float4vertex:SV_POSITION;
    float3wPos:TEXCOORD1;
    float3normal:TEXCOORD2;
    UNITY_FOG_COORDS(3)
    };
    fixed4_TrailColor;
    float_TrailPower;
    float_TrailLength;
    v2fvert(a2vv)
    {
    v2fo;
    o.wPos=mul(unity_ObjectToWorld,v.vertex);
    o.normal=UnityObjectToWorldNormal(v.normal);
    v.vertex.xyz+=v.normal*0.01;
    o.vertex=mul(UNITY_MATRIX_M,v.vertex);
    float3lightDir=normalize(UnityWorldSpaceLightDir(o.wPos));
    floatNdotL=min(0,dot(o.normal,lightDir.xyz));
    o.vertex.xyz+=lightDir*NdotL*_TrailLength;
    o.vertex=mul(UNITY_MATRIX_VP,o.vertex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    returno;
    }
    fixed4frag(v2fi):SV_Target
    {
    floatnor=dot(i.normal,normalize(UnityWorldSpaceLightDir(i.wPos)));
    fixed4col=_TrailColor*(pow(1.5*_TrailColor.a-abs(nor),_TrailPower));
    UNITY_APPLY_FOG(i.fogCoord,col);
    returncol;
    }
    ENDCG
    }
    }
    }