Unity baked AO and dynamic shadows problem

Hi all,
I baked with Beast only AO into the lightmaps, because I wanted to use realtime shadows on the objects (the player can change dynamically the sun position, so baked shadows aren’t a option). Furthermore it would be easier to bake all the ao maps with Beast than for every model in Blender and I would also gain AO between different static objects. My shader works, but it is shading the areas in shadows wrong:

As you can see the wall takes the sun light position into account. This is not I want to achive. What I want is more corrected light like this (but here AO is missing!):

First have a look at the shader:

Shader "Toon/Outline Lightmap" {

Properties {
  _Color ("Main Color", Color) = (0.5,0.5,0.5,1)
  _MainTex ("Base (RGB)", 2D) = "white" {}
  _BumpMap("Normal Map", 2D) = "bump" {}
 _Dummy ("Dummy", 2D) = "white" {}
  //_SpecularTex ("Specular Map", 2D) = "gray" {}
  _SpecularPower ("Specular Intensity (0.0 - 5.0)", float) = 0.5 //Range(0.0, 5.0)
  _Ramp ("Toon Ramp (RGB)", 2D) = "gray" {}
  _OutlineColor ("Outline Color", Color) = (0,0,0,1)
  _Outline ("Outline width (.002 - .03)", float) = .005 //Range(0.002, 0.03)
}

SubShader {

Tags { "RenderType"="Opaque" }

LOD 200

UsePass "Toon/Basic Outline/OUTLINE"

Cull Back

CGPROGRAM

#pragma surface surf ToonRamp nolightmap

sampler2D _Ramp;
sampler2D _MainTex, _BumpMap;// , _SpecularTex;
half4 _Color;
half _SpecularPower;
sampler2D unity_Lightmap;
float4 unity_LightmapST;
sampler2D _Dummy;

// custom lighting function that uses a texture ramp based

// on angle between light direction and normal

#pragma lighting ToonRamp exclude_path:prepass

inline half4 LightingToonRamp (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
#ifndef USING_DIRECTIONAL_LIGHT
  lightDir = normalize(lightDir);
#endif

 half d = dot (s.Normal, lightDir)*0.5 + 0.5;
 half3 ramp = tex2D (_Ramp, float2(d,d)).rgb;

 half nh = max (0, dot (s.Normal, lightDir));
 half spec = pow (nh, s.Gloss * 128) * s.Specular * _SpecularPower;

 half4 c;
 c.rgb = (s.Albedo * _LightColor0.rgb * ramp + _LightColor0.rgb * spec) * (atten * 2);
 c.a = 0;

  return c;
}

struct Input {
  half2 uv_MainTex : TEXCOORD0;
  half2 uv2_Dummy;
  half3 worldNormal;
};

void surf (Input IN, inout SurfaceOutput o) {
 half4 c =  tex2D(_MainTex, IN.uv_MainTex) * _Color;
 float2 lmuv = IN.uv2_Dummy.xy * unity_LightmapST.xy + unity_LightmapST.zw;

 o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));

  half3 specGloss = tex2D(_BumpMap, IN.uv_MainTex).rgb;

 o.Specular = specGloss.r;
 o.Gloss = specGloss.g;

 o.Albedo =  c.rgb * DecodeLightmap( tex2D (unity_Lightmap, lmuv) )  ;
 o.Alpha = c.a;

}

ENDCG
}
Fallback "Diffuse"
}

I think the problem is that the lightmap is just multiplied into o.Albedo. Instead I should take the lightmap into calculation of the light into the function LightingToonRamp(). But I didn’t managed to use the lightmap data there.

I read somewhere that it is only possible to use the lightmap data with a custom vert/frag-shader, is there another solution?

Additionally I could imagine that I must change how Unity is handling the generated lightmaps. Where could I change those built-in shaders?

Any help? Thank you.
0tacun

I have same problem - I just want to use very lowres lightmaps for approximating ambient light contact AO shadows and add realtime-only directional light with shadows (sun) on top.

One way to achieve that is switching to Dual lightmaps and setting realtime shadow radius to high value. However, that kind of defeats purpose as you end up with two sets of lightmaps (near and far)

Yes, it is really strange, as if lightmapping has a own lighting-function applied on top of your shader. I couldn’t find anything regarding this…

Well, I found a solution: Just use Deferred Rendering and propably a standard built-in shader and it should behave as expected.

I’m still wondering why there is such a difference. Could it be because in Forward Rendering there is a extra pass for lightmapping? How could I achive consistent shadows in Forward Rendering?

New update: I managed to let it work in forward rendering whilst I added to the #pragma section in my shader “fullforwardshadows”. Unfortunately is only works with Unity Pro, as it seems that the shadows are again calculated after the lightmapping. I’m still wondering does it now works something like this:

  1. Directional light/ shadow pass
  2. Lightmap pass
  3. again light/ shadow pass

I hope someone could clarify it and help me.