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 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