此着色器存在的问题
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"
}
如果在对象的材质上使用此着色器,则仅从法线的侧面照亮对象,即使直接将光线指向对象,该侧面也不会照亮。还要向着色器添加什么代码,以使在相反的法线显示的灯光也能添加?它可以与“自然/树木软遮挡叶子”着色器完美配合,但是此着色器非常繁重,并且依赖于另一个着色器,另一个依赖于另一个着色器。而且,叶子着色器包含很多多余的着色器。上面的着色器非常轻巧,我想添加一些最少的东西,只是要覆盖两侧(法线和法线的相反侧)。
答案 0 :(得分:1)
您要使用它到底是什么?是为了叶子吗?
这里有两个选项:创建“顶点片段”着色器而不是“表面”着色器,然后自己编写照明代码(使用abs(NdotL)而不是saturate(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