最近在看u3d 5.3.3着色器的源码,这里先简单的分析下UnityShaderVariables.cginc 中 UnityLighting的_WorldSpaceLightPos0的值是怎么获取的。
CBUFFER_START(UnityLighting) //光照的参数
//_WorldSpaceLightPos0.w可以表明该光源的类型,如果为0表示是平行光,为1表示是点光源或者聚光灯光源。
#ifdef USING_DIRECTIONAL_LIGHT
uniform half4 _WorldSpaceLightPos0; //位置 lightdir = nor(lightpos) 光源的向量
#else
uniform float4 _WorldSpaceLightPos0;
#endif
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range 点光源才有效 阴影的时候才会有值
。。。。。。
通过帧调试窗口,可以看到这个值是。
图一中的是近视值,右键copy会得到真实的值,通过比较发现和我自己计算出来的是一样的。直接上代码
void TestLigth()
{
//ForwardBase的光源应该是平行光
//ForwardAdd的类型不限制
Vector4 lightInfo;
if (mLight.type != LightType.Directional)
{
Vector3 worldPos = mLight.transform.position;
lightInfo = worldPos;
lightInfo.w = 1.0f;
}//The light is a directional light.
else
{
Vector3 worldDir = mLight.transform.TransformDirection(new Vector3(0, 0, -1));
// worldDir1 = MyTransform.TransformDirection(mLight.transform, new Vector3(0, 0, -1));
lightInfo = worldDir;
lightInfo.w = 0.0f;
}
_WorldSpaceLightPos0 = lightInfo;
//_LightMatrix0 == world2Light
_LightMatrix0 = mLight.transform.worldToLocalMatrix;
//UnityLightingCommon.cginc fixed4 _LightColor0;
//kShaderVecLightColor0
_LightColor0 = mLight.color * mLight.intensity;
//MeshRenderer
}