- Home /
How to correct shading with ao lightmaps from Beast
Hi all,
I baked with Beast only AO into the lightmaps, because I wanted to use realtime shadows on the 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.
Any help? Thank you.
0tacun
I noticed that it is solvable with deferred rendering enabled. Has someone a clue why it is different from forward rendering and how to change this behavior?
Your answer
Follow this Question
Related Questions
Vertex colour transparency and Beast lightmapping? 3 Answers
Transparent glsl shader is still opaque in the lightmap. 0 Answers
lightmap transitions? 1 Answer
Mobile BEAST lightmapping shader/lighting question 0 Answers
Lightmapping Single objects 0 Answers