UnityShader源码2017---学习笔记与自我拓展010

源自ShowLightMask

Properties里面的_SrcBlend _DstBlend在下面的码中并没有用的。忽略。

在vert_surf体里,看到了这么一行。

o.uv.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;

这么基本上就知道了这次的_MainTex是lightmap。

参数中除了_MainTex,之外,还有两个texture,_LightTexture,_LightTextureB,从UnitySpotCookieUnitySpotAttenuate可以推断出,_LightTexture是类似Cookie一样的贴图,而_LightTextureB也应该是衰减贴图。


上图来自wikibooks

fixed UnitySpotCookie ( float4 LightCoord)
{
return tex2D (_LightTexture, LightCoord.xy / LightCoord.w + 0.5 ).w;
}
fixed UnitySpotAttenuate ( float3 LightCoord)
{
return tex2D (_LightTextureB, dot (LightCoord, LightCoord).xx). UNITY_ATTEN_CHANNEL ;
}
两个方法,常规的tex2D,唯一要注意的就是uv的部分以及 UNITY_ATTEN_CHANNEL。

根据下文,可以明确地知道,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里修改成这样,也是对的。

fixed UnitySpotCookie ( float4 LightCoord)
{
    float4 textureCoords = float4 (LightCoord.xy+ 0.5 * LightCoord.w, 0 ,LightCoord.w);
    return tex2Dproj (_LightTexture, textureCoords).a;
//return tex2D(_LightTexture, LightCoord.xy / LightCoord.w + 0.5).w;
}

请注意,这里并没有测试。

但是为啥要加0.5呢,依旧没有解释。


似乎跟light空间的转换矩阵有关系。基础太薄弱,要不先这么苟一下。然后mark一下。通读第一遍不能在细节问题上卡住。


关于UNITY_ATTEN_CHANNEL在HLSLSupport中找到了蛛丝马迹。

#if defined ( SHADER_API_D3D9 ) || defined ( SHADER_API_D3D11 ) || defined ( SHADER_API_D3D11_9X ) || defined ( SHADER_API_PSP2 ) || defined ( SHADER_API_PSSL )
#define UNITY_ATTEN_CHANNEL r
#else
#define UNITY_ATTEN_CHANNEL a
#endif

写的这么明确,我就不在解释了吧。

在frag_surf中,看到了熟悉的取某一通道的做法。

float result = dot (_ChannelSelect, mainTexSampled.rgba);

再下面的ifelse就是对平行光,点光源,聚光灯的分支了

平行光没有衰减

点光源是以距离为基础的衰减。

聚光灯就复杂了

这一块就开始迷茫了,我翻了翻,找到了@candycat1992的售后服务文章。赞。突然想起,入门精要虽然看了两三遍,但是却迟迟没有看关于阴影的部分。是时候拿起来重新拜读一下了。

_LightTexture是一张存储了衰减信息的纹理。应该是与autolight.cginc里的_LightTexture0是一样的。

然后我们开启测试之路。

然后测试结束了。。。

可能是测试有问题。。所以就暂时不做记录了。。

下面的链接解释了我的问题,感谢!

https://github.com/candycat1992/Unity_Shaders_Book/issues/47

猜你喜欢

转载自blog.csdn.net/u012871784/article/details/80508630