Last active
March 13, 2020 10:03
-
-
Save stilllisisi/d7dd628a6565a2edd4c0611b9b048ca6 to your computer and use it in GitHub Desktop.
【游戏-Shader】Shader实现体积光影。shader实现阴影基础上,实现体积光影的方法
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //思路: | |
| //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 | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://gameinstitute.qq.com/community/detail/128710