fixed3 calculateAmbientLight(half3 normalWorld)
{
//Flat ambient is just the sky color
fixed3 ambient = unity_AmbientSky.rgb * 0.75;
#if defined(TRI_COLOR_AMBIENT)
//Magic constants used to tweak ambient to approximate pixel shader spherical harmonics
fixed3 worldUp = fixed3(0,1,0);
float skyGroundDotMul = 2.5;
float minEquatorMix = 0.5;
float equatorColorBlur = 0.33;
float upDot = dot(normalWorld, worldUp);
//Fade between a flat lerp from sky to ground and a 3 way lerp based on how bright the equator light is.
//This simulates how directional lights get blurred using spherical harmonics
//Work out color from ground and sky, ignoring equator
float adjustedDot = upDot * skyGroundDotMul;
fixed3 skyGroundColor = lerp(unity_AmbientGround, unity_AmbientSky, saturate((adjustedDot + 1.0) * 0.5));
//Work out equator lights brightness
float equatorBright = saturate(dot(unity_AmbientEquator.rgb, unity_AmbientEquator.rgb));
//Blur equator color with sky and ground colors based on how bright it is.
fixed3 equatorBlurredColor = lerp(unity_AmbientEquator, saturate(unity_AmbientEquator + unity_AmbientGround + unity_AmbientSky), equatorBright * equatorColorBlur);
//Work out 3 way lerp inc equator light
float smoothDot = pow(abs(upDot), 1);
fixed3 equatorColor = lerp(equatorBlurredColor, unity_AmbientGround, smoothDot) * step(upDot, 0) + lerp(equatorBlurredColor, unity_AmbientSky, smoothDot) * step(0, upDot);
return lerp(skyGroundColor, equatorColor, saturate(equatorBright + minEquatorMix)) * 0.75;
#endif // TRI_COLOR_AMBIENT
return ambient;
}
unity GradientAmbient映射方法
最新推荐文章于 2024-08-15 10:09:55 发布