自定义阴影
原理
平面阴影
Pass
{
Name "Shadow"
Blend SrcAlpha OneMinusSrcAlpha
Stencil//避免阴影重影
{
Ref 255
Comp NotEqual
Pass Replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 PositionClip : SV_POSITION;
};
float4 _ShadowColor;
float4 _Offset;
v2f vert (appdata v)
{
v2f o;
float4 PositinWS=mul(unity_ObjectToWorld,v.vertex);//世界坐标
float WorldPosY=PositinWS.y;//未被污染的Y值
PositinWS.y=_Offset.y;//平面
PositinWS.xz+=_Offset.xz*(WorldPosY-_Offset.y);//控制轴点
o.PositionClip = mul(UNITY_MATRIX_VP,PositinWS);//裁剪坐标
return o;
}
half4 frag (v2f i) : SV_Target
{
return _ShadowColor;
}
ENDCG
}
宏阴影
Unity自带的用来渲染阴影的三个宏,分别是SHADOW_COORDS, TRANSFER_SHADOW以及SHADOW_ATTENUATION。
//引入头文件
#include "AutoLight.cginc"
//输出结构体:
struct v2f {
//其他属性的声明
...
//声明阴影纹理坐标
SHADOW_COORDS(2)
};
//顶点Shader:
struct v2f {
//其他属性的声明
...
//声明阴影纹理坐标
SHADOW_COORDS(2)
};
//片元Shader:
fixed4 frag(v2f i) : SV_Target {
//物体表面光照、着色计算
//使用内置宏对阴影进行采样
fixed shadow = SHADOW_ATTENUATION(i);
return fixed4(ambient + (diffuse + specular) * atten * shadow, 1.0);
}
//结束
Fallback "Diffuse"
Shadow Mask
Shadowmask是一种特定于URP的阴影渲染技术。Shadowmask通过使用两个渲染通道来处理实时阴影,其中一个通道用于渲染实时阴影,另一个通道用于渲染静态阴影。这种技术有助于提高渲染性能并减少实时阴影的计算成本。
https://docs.unity3d.com/Manual/LightMode-Mixed-Shadowmask.html
https://cloud.tencent.com/developer/article/1764847