源自ShowLightMask
Properties里面的_SrcBlend _DstBlend在下面的码中并没有用的。忽略。
在vert_surf体里,看到了这么一行。
这么基本上就知道了这次的_MainTex是lightmap。
参数中除了_MainTex,之外,还有两个texture,_LightTexture,_LightTextureB,从UnitySpotCookie和UnitySpotAttenuate可以推断出,_LightTexture是类似Cookie一样的贴图,而_LightTextureB也应该是衰减贴图。
上图来自wikibooks
根据下文,可以明确地知道,LightCoord接收的信息是在Light空间中的顶点信息。然后做了一次透视除法,转成了非齐次坐标的xy。为啥是xy,因为灯光的z放向是光源照射放向,我们需要在xy放向上sample cookiemap。接下来就是+0.5的问题了。
why 0.5?
wiki上没有解释为什么,只是这么说的
本来应该是
vec3 textureCoords = vec3(vec2(positionInLightSpace)+ vec2(0.5 * positionInLightSpace.w),positionInLightSpace.w); cookieAttenuation = texture2DProj(_LightTexture0, textureCoords).a;
但是unity里用了tex2D ,没有用tex2DProj,也就是说自己做透视除法。
于是就变成了上面的结果
也就是说在unity里修改成这样,也是对的。
请注意,这里并没有测试。
但是为啥要加0.5呢,依旧没有解释。
似乎跟light空间的转换矩阵有关系。基础太薄弱,要不先这么苟一下。然后mark一下。通读第一遍不能在细节问题上卡住。
关于UNITY_ATTEN_CHANNEL在HLSLSupport中找到了蛛丝马迹。
写的这么明确,我就不在解释了吧。
在frag_surf中,看到了熟悉的取某一通道的做法。
再下面的ifelse就是对平行光,点光源,聚光灯的分支了
平行光没有衰减
点光源是以距离为基础的衰减。
聚光灯就复杂了
这一块就开始迷茫了,我翻了翻,找到了@candycat1992的售后服务文章。赞。突然想起,入门精要虽然看了两三遍,但是却迟迟没有看关于阴影的部分。是时候拿起来重新拜读一下了。
_LightTexture是一张存储了衰减信息的纹理。应该是与autolight.cginc里的_LightTexture0是一样的。
然后我们开启测试之路。
然后测试结束了。。。
可能是测试有问题。。所以就暂时不做记录了。。
下面的链接解释了我的问题,感谢!
https://github.com/candycat1992/Unity_Shaders_Book/issues/47