Проблема с шейдером.Объект освещается только со стороны нормали - PullRequest
0 голосов
/ 29 ноября 2018

Проблемы с этим шейдером

Shader "Diffuse " {
Properties {
_Color("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}

}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 150
Cull Off

CGPROGRAM
#pragma surface surf Lambert noforwardadd

sampler2D _MainTex;
fixed4 _Color;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb * _Color;
o.Alpha = c.a;
}
ENDCG
}

Fallback "Mobile/VertexLit"
}

Если вы используете этот шейдер на материале объекта, то объект освещается только со стороны нормали, а противоположная сторона остается неосвещенной, даже если вы направитесвет прямо на него.Какой код добавить в шейдер, чтобы подсветка тоже отображалась на противоположной нормальной стороне?Он отлично работает с шейдером Nature / Tree Soft Occlusion Leaves, но этот шейдер очень тяжелый и зависит от другого, а другой - от другого шейдера.И в листьях шейдера содержится много лишнего.Вышеуказанный шейдер очень легкий, и я хотел бы добавить что-то минимальное, просто чтобы осветить две стороны - нормаль и противоположность нормали.Normal and opposite-normal side with directional light. Cyan spikes is direction of normals

1 Ответ

0 голосов
/ 28 декабря 2018

Для чего именно вы хотите использовать это?Это для листвы?

Здесь есть два варианта: либо вы создаете шейдер 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

...