【总结】shader中存取光源的变量

一.存取光源的变量
1.float4 _WorldSpaceLightPos0矢量,与之相对应的是一个float4 _LightColor0。
这是一个表示世界做表中的光源的位置矢量或者方向矢量;
如果_WorldSpaceLightPos0.w为0,则表示该光源为平行光,_WorldSpaceLightPos0.xyz为此平行光的方向向量;
反之_WorldSpaceLightPos0.w不为0,则表示光源为点光源,_WorldSpaceLightPos0.xyz为此点光源.


2.float4 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0;与之相对应的是float4 unity_4LightAtten0表示光源的衰减,
还有float4 unity_4LightColor[4]表示对应光源的颜色。
这3个四元数表示4个光源的x、y、z坐标;
unity并没有告诉我们这3个四元数表示什么样的光源;
unityCG.cginc中的Shade4PointLights函数似乎暗示这是4个点光源;


3.float4 unity_LightPosition[4]表示4个点光源的光源位置或者平行光的方向矢量。
与之相对应的是float4 unity_LightColor[4]存储光源颜色,float4 unity_LightAtten[4]存储了光源衰减;
如果unity_LightPosition[index].w为0,则表示该光源为平行光,如1。


二.两种渲染路径下可用的存取光源的信息
1.VertexLit(LightMode="Vertex"):unity_4LightPos[X,Y,Z]0与_WorldSpaceLightPos0都不可用;
可以从unity_LightPosition[4]数组中获得光源信息
(只要是LightMode = "Vertex"的Pass无论在Camera的RenderingPath为VertexLit、Forward、还是Deferred,unity都会几十更新此数组中的光源信息)。
而unity_LightPosition存储的是视空间中的光源信息(参考UnityCg.cginc中的ShadeVertexLights函数)。


2.Forward (LightMode="ForwardBase"或者"ForwardAdd")[若要使用ForwardAdd则必须与ForwardBase一起使用,不然会被Unity忽略]:
当场景中的平行光和点光源全部为Vertex光源时,ForwardBase执行了,但ForwardAdd全部没有执行并且_WorldSpaceLightPos0没有光源数据。
当场景中存在一个Pixel平行光时,ForwardAdd仍然没有执行,但是_WorldSpaceLightPos0和_LightColor0都有了数据。
当场景中存在一个平行光和任意一个以上其他光源设为Pixel光源时,ForwardBass.ForwardAdd内的_WorldSpaceLightPos0和_LightColor0都有数据。

猜你喜欢

转载自blog.csdn.net/u012239432/article/details/48575409