It looks to me like Unity has a serious bug somewhere inside its surface-shader-compiler.
Please have a look at these images and then scroll down to the code for each shader.
Shader "Custom/Fogged0"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
struct Input
{
fixed null;
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = _MainColor.rgb;
o.Alpha = _MainColor.a;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged1"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
struct Input
{
fixed3 worldRefl;
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = _MainColor.rgb;
o.Alpha = _MainColor.a;
o.Emission = IN.worldRefl * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged2"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
struct Input
{
fixed3 worldRefl;
fixed4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = _MainColor.rgb + 0.01 * IN.color.rgb;
o.Alpha = _MainColor.a + 0.01 * IN.color.a;
o.Emission = IN.worldRefl * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged3"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
struct Input
{
fixed3 worldRefl;
fixed4 color : COLOR;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = _MainColor.rgb + 0.01 * IN.color.rgb;
o.Alpha = _MainColor.a + 0.01 * IN.color.a;
o.Emission = IN.worldRefl * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged4"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
struct Input
{
fixed3 worldRefl;
fixed4 color : COLOR;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = _MainColor.rgb + 0.01 * IN.color.rgb;
o.Alpha = _MainColor.a + 0.01 * IN.color.a;
o.Normal = float3(0, 0, 1);
o.Emission = IN.worldRefl * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged5"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
_MainTex ("_MainTex", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
sampler2D _MainTex;
struct Input
{
fixed2 uv_MainTex;
fixed3 worldRefl;
fixed4 color : COLOR;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = mainTex.rgb * _MainColor.rgb + 0.01 * IN.color.rgb;
o.Alpha = mainTex.a * _MainColor.a + 0.01 * IN.color.a;
o.Normal = float3(0, 0, 1);
o.Emission = IN.worldRefl * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged6"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
_MainTex ("_MainTex", 2D) = "white" {}
_Cube ("_Cube", Cube) = "" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
sampler2D _MainTex;
samplerCUBE _Cube;
struct Input
{
fixed2 uv_MainTex;
fixed3 worldRefl;
fixed4 color : COLOR;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = mainTex.rgb * _MainColor.rgb + 0.01 * IN.color.rgb;
o.Alpha = mainTex.a * _MainColor.a + 0.01 * IN.color.a;
o.Normal = float3(0, 0, 1);
o.Emission = texCUBE(_Cube, IN.worldRefl).rgb * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/Fogged7"
{
Properties
{
_MainColor ("_MainColor", Color) = (1, 1, 1, 1)
_MainTex ("_MainTex", 2D) = "white" {}
_Cube ("_Cube", Cube) = "" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf BlinnPhong
#pragma target 3.0
fixed4 _MainColor;
sampler2D _MainTex;
samplerCUBE _Cube;
struct Input
{
fixed2 uv_MainTex;
fixed3 worldRefl;
INTERNAL_DATA
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 mainTex = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = mainTex.rgb * _MainColor.rgb;
o.Alpha = mainTex.a * _MainColor.a;
o.Normal = float3(0, 0, 1);
o.Emission = texCUBE(_Cube, IN.worldRefl).rgb * 0.01;
}
ENDCG
}
FallBack "Diffuse"
}
Long story short.
As soon as you add both - texture UVs and vertex colors - to the Input structure that holds the worldRefl vector Untiy fails silently to render the fog when the object also receives shadows.
If however you leave one of it out of the equation (texture UVs or vertex colors or shadows) Unity is able to fog the object correctly.
But: leaving shadows out of the equation is a no go as is leaving out vertex colors or texture UVs.
I seriously doubt that this stuff is working as intended.