版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wodownload2/article/details/82108643
把自发的颜色烘焙到lightmap,并且完成采样。
首先就是项目的地址:
https://pan.baidu.com/s/1ijDLCpSWhIyaNjrRKDoPVA
展示的效果为:
只有Floor这个物体使用的是另外一个材质球,Green:
这个是我们自己新创建的。他使用的shader依然是My First Lighting Shader。之所以这样,因为我们想单独改变Floor的颜色。
然后就是烘焙场景了,烘焙之后如何使用数据,才是关键。
首先增加的是一个元通道:
这个是unity自身的Lightmapper会默认寻找的一个通道,用于采样自发光的烘焙数据。
然后就是针对这个通道写一个My Lightmapping.cginc文件,里面包含了如何编写顶点着色器,以及片段着色器。
其完整程序在项目中,这里只介绍一下几个注意点:
第一个:GetEmission函数
就是如何求自发光颜色,如果使用了自发光贴图,则采样图片并乘以自发光颜色值。否则只是简单的使用自发光颜色。
float3 GetEmission (Interpolators i) {
#if defined(_EMISSION_MAP)
return tex2D(_EmissionMap, i.uv.xy) * _Emission;
#else
return _Emission;
#endif
}
第二个:MyLightmappingFragmentProgram函数
求自发光+求环境光+累加反射光(或者叫高光或者叫镜面光)
float4 MyLightmappingFragmentProgram (Interpolators i) : SV_TARGET {
UnityMetaInput surfaceData;
surfaceData.Emission = GetEmission(i); //求自发光
float oneMinusReflectivity;
surfaceData.Albedo = DiffuseAndSpecularFromMetallic(
GetAlbedo(i), GetMetallic(i),
surfaceData.SpecularColor, oneMinusReflectivity
); //求环境光
float roughness = SmoothnessToRoughness(GetSmoothness(i)) * 0.5;
surfaceData.Albedo += surfaceData.SpecularColor * roughness; //累加发射光(或者叫高光或者叫镜面光)
return UnityMetaFragment(surfaceData);
}