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.
【游戏-Shader】Shader实现体积光影。shader实现阴影基础上,实现体积光影的方法
//思路:
//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
}
}
}
@stilllisisi
Copy link
Author

1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment