包含此页的版本:
不含此页的版本:
实现对接收阴影的支持需要将基础光照通道编译为
多个变体,以正确处理“无阴影的定向光”和“有阴影的定向光”的情况。#pragma multi_compile_fwdbase 指令执行此作(有关详细信息,请参阅多个着色器变体)。事实上,它的作用远不止于此:
它还为不同的lightmap:预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表类型EnlightenGeomerics 的照明系统,用于 Unity 中用于 Enlighten 实时全局照明。更多信息
请参阅术语表实时全局光照 一组对直接和间接光照进行建模以提供逼真的光照结果的技术。
请参阅术语表打开或关闭等。目前我们不需要所有这些,因此我们将明确跳过这些变体。
然后,为了获得实际的阴影计算,我们将 #include“AutoLight.cginc” 着色器在 GPU 上运行的程序。更多信息
请参阅术语表 include 文件并使用其中的SHADOW_COORDS、TRANSFER_SHADOW SHADOW_ATTENUATION宏。
下面是着色器:
Shader "Lit/Diffuse With Shadows"
{
Properties
{
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
Tags {"LightMode"="ForwardBase"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
// compile shader into multiple variants, with and without shadows
// (we don't care about any lightmaps yet, so skip these variants)
#pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
// shadow helper functions and macros
#include "AutoLight.cginc"
struct v2f
{
float2 uv : TEXCOORD0;
SHADOW_COORDS(1) // put shadows data into TEXCOORD1
fixed3 diff : COLOR0;
fixed3 ambient : COLOR1;
float4 pos : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
half3 worldNormal = UnityObjectToWorldNormal(v.normal);
half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
o.diff = nl * _LightColor0.rgb;
o.ambient = ShadeSH9(half4(worldNormal,1));
// compute shadows data
TRANSFER_SHADOW(o)
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// compute shadow attenuation (1.0 = fully lit, 0.0 = fully shadowed)
fixed shadow = SHADOW_ATTENUATION(i);
// darken light's illumination with shadow, keep ambient intact
fixed3 lighting = i.diff * shadow + i.ambient;
col.rgb *= lighting;
return col;
}
ENDHLSL
}
// shadow casting support
UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
}
}
看,我们现在有影子了!