将光照贴图烘焙到预设

好久没写技术贴了,最近别的项目组遇到一个需求,希望将Unity烘焙出来的结果直接绑定到预设上去,而不再依赖Unity的光照贴图系统(也就是与场景脱钩)

研究了一下帮他们解决了,解决的思路是
1. 提取Unity的烘焙好的EXR资源
2. 获取我们的物体在这张贴图上的Tiling和Offset
3. 利用上述数据对光照信息进行采样,然后通过DecodeLightmap进行解码

使用方法
先提取EXR文件 EXR 提取Tiling和Offset 提取Tiling 配置光照贴图和参数 配置 大功告成,看看最终的结果吧 最终效果图

下面是shader的源码

Shader "MyShaderLib/lightmap" {

    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _LightMap ("Lightmap (RGB)", 2D) = "black" {}

        _TiLingX("TiLingX",float) = 1
        _TiLingY("TiLingY",float) = 1
        _OffsetX("OffsetX",float) = 1
        _OffsetY("OffsetY",float) = 1
    }

    SubShader 
    {
        Pass
        {
            Cull Off 
            Tags{"queue" = "200" "LightMode"= "ForwardBase"}

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                half2 uv1:TEXCOORD1;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float2 lightMap :TEXCOORD1;
                float4 pos : SV_POSITION;
            };
            sampler2D _MainTex;
            sampler2D _LightMap;
            float4 _LightMap_ST;
            float4 _MainTex_ST;

            fixed _TiLingX;
            fixed _TiLingY;
            fixed _OffsetX;
            fixed _OffsetY;

            v2f vert (appdata v)
            {
                fixed2 offset = fixed2(_OffsetX,_OffsetY);
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                o.lightMap = TRANSFORM_TEX(v.uv1  ,_LightMap) * _TiLingX + offset;

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                fixed3 lm = DecodeLightmap (tex2D(_LightMap, i.lightMap ));
                col.rgb *= lm.rgb;

                return col;
            }
            ENDCG
        }
    }
   FallBack "Diffuse"
 }

kisence

潮落江平未有风。