unity 的shader提供了2种光照模式:ForwardBase和ForwardAdd。
如果我们的shader想要处理多种光照,那么这两种光照模式就都要被实现到不同的pass中。
其中ForwardBase中处理的必然是平行光,所以想要处理点光源等其它光源需要在ForwardAdd中进行处理。
网上很多讲解点光源的文章,很多都特别复杂或者根本运行不了,其实处理起来非常简单,unity已经给我们提供了现成的宏,供我们使用:UNITY_LIGHT_ATTENUATION
需要注意的是想要使用这个宏我们需要引入AutoLight,UnityPBSLighting两个文件:
#include "Autolight.cginc"
#include "UnityPBSLighting.cginc"
由于UNITY_LIGHT_ATTENUATION宏中使用了#ifdef POINT来进行判断,所以想要使宏生效我们需要在引入文件之前
#define POINT
最后我们的ForwardAdd的pass看起来应该是这样:
Pass{
Tags { "LightMode" = "ForwardAdd"}
Blend One One
CGPROGRAM
fixed4 _Color;
#define POINT
#include "Autolight.cginc"
#include "UnityPBSLighting.cginc"
#pragma vertex vert
#pragma fragment frag
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
};
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos (v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
return o;
}
fixed4 frag(v2f i) : SV_Target{
UNITY_LIGHT_ATTENUATION(attenuation, 0, i.worldPos);
return _Color*attenuation;
}
ENDCG
}
这里只是简单的对点光源进行了处理,没有其它任何内容。
看下效果: