Я думаю, что проблема в том, что вы преобразовываете нормаль, используя матрицу unity_ObjectToWorld, которая также включает масштаб.Это может привести к изменению масштаба или сдвигу нормалей, что может быть тем, что происходит, учитывая, насколько темнее выглядит версия Unity.Вместо этого я советую использовать встроенную функцию, включенную в UnityCG.cginc:
o.color.rgb = UnityObjectToWorldNormal(v.normal);
Нормальное значение в идеале должно быть нормализовано и в функции фрагмента, поскольку аппаратные интерполяторы не гарантируют, что ваши значения останутсянормализуется.Кроме того, в вашем шейдере есть куча дополнительных вещей, которые на самом деле не нужны - вы можете удалить следующие строки:
#pragma multi_compile_fog
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
sampler2D _MainTex;
float4 _MainTex_ST;
РЕДАКТИРОВАТЬ: обратите внимание также, что кажется, что MeshNormalMaterial отображает нормали в пространстве видаа не в мировом пространстве.Вот как вы преобразуете нормальный мир в пространство вида:
float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_V, worldNormal));