Для чего именно вы хотите использовать это?Это для листвы?
Здесь есть два варианта: либо вы создаете шейдер Vertex Fragment вместо шейдера Surface, и кодируете освещение самостоятельно (используя abs (NdotL) вместо насыщенного (NdotL)), либо реализуете свое собственное освещениефункция.
Если вы хотите использовать поверхностные шейдеры, создайте новую функцию, например:
#include "UnityCG.cginc"
half4 LightingFoliage(SurfaceOutput s, half3 lightDir, half atten) {
half NdotL = abs(dot(s.Normal, lightDir));
half4 color;
color.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
color.a = s.Alpha;
return color;
}
Затем измените это:
#pragma surface surf Lambert noforwardadd
На это:
#pragma surface surf Foliage noforwardadd
Теперь у вас есть базовое ламбертовское освещение, вы можете использовать эту функцию так, как хотите.Обратите внимание, что использование abs (NdotL) выглядит правильно только для плоских вещей, таких как листья;Вы можете сделать двусторонний шейдер более общего назначения, используя семантику VFACE, чтобы выяснить, визуализируете ли вы заднюю сторону, и просто умножить нормаль на значение VFACE (-1, если задняя сторона, 1, если передняя сторона).Вы можете прочитать больше о VFACE здесь: https://docs.unity3d.com/Manual/SL-ShaderSemantics.html