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