青青草原——草的颜色渐变、AO模拟、简易透光


一、草的颜色渐变

实现方式

step1:定义两个渐变色

step2:定义渐变因子

step3:将渐变后的颜色与主颜色进行混合

伪代码如下:

half4 gradientColor1;
half4 gradientColor2;
half gradientTerm;
half4 finalGradientColor = lerp(gradientColor1,gradientColor2,gradientTerm);
half3 finalColor = finalGradientColor.rgb * albedoColor.rgb;

扩展方式

可以使用 noise 贴图或者程序 noise 计算,并把这个值加入的渐变色的混合因子中,来实现颜色的随机变换

二、AO模拟

实现方式

step1:定义一个AO的颜色

step2:AO的Mask计算可以用如下方式:

  • 方式一:使用UV的V
  • 方式二:使用法线和竖直向上及(0,1,0)的点乘值
  • 方式三:使用第四套UV,并通过绘制贴图的 R 通道进行控制,也是本案例中采用方式

step3:将AO的颜色与主颜色进行混合

伪代码如下:

half4 AOColor;
half AOMask = tex2D(_AOMaskTex,uv4);
half4 finalAoColor = lerp(AOColor,half4(1,1,1,1),AOMask);
half3 finalColor = finalAoColor.rgb * albedoColor.rgb;

三、透光实现

实现方式

step1:定义一个透光颜色

step2:观察方向的Mask计算:观察方向和主光源相反的方向越一致,透光的效果就越强烈,通过点乘计算,并将值重新映射到0,1

step3:贴图mask:使用第四套UV,并通过绘制贴图的 G 通道进行控制

step4:将透光的颜色与主贴图颜色进行 叠加

伪代码如下:

half4 subsurfaceColor;
half viewMask = dot(viewDir,-lightDir);
viewMask = viewMask * 0.5 + 0.5;
half texMask = tex2D(_AOMaskTex,uv4);
half4 finalSubsurfaceColor = subsurfaceColor * viewMask * texMask;
half3 finalColor = finalSubsurfaceColor.rgb + albedoColor.rgb;

  目录