unity 的shader提供了2种光照模式:ForwardBase和ForwardAdd。spa
若是咱们的shader想要处理多种光照,那么这两种光照模式就都要被实现到不一样的pass中。code
其中ForwardBase中处理的必然是平行光,因此想要处理点光源等其它光源须要在ForwardAdd中进行处理。orm
网上不少讲解点光源的文章,不少都特别复杂或者根本运行不了,其实处理起来很是简单,unity已经给咱们提供了现成的宏,供咱们使用:UNITY_LIGHT_ATTENUATIONblog
须要注意的是想要使用这个宏咱们须要引入AutoLight,UnityPBSLighting两个文件:ip
#include "Autolight.cginc" #include "UnityPBSLighting.cginc"因为UNITY_LIGHT_ATTENUATION宏中使用了#ifdef POINT来进行判断,因此想要使宏生效咱们须要在引入文件以前 #define POINT
最后咱们的ForwardAdd的pass看起来应该是这样:get
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 }
这里只是简单的对点光源进行了处理,没有其它任何内容。it
看下效果:io