unity的烘焙学习(7)——使用烘焙的自发光颜色

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/82108643
今日推荐