"Unity-chan" Model 的卡通渲染
"Unity-chan" Model这个插件可以在官方网站上面下载。
插件中用到的卡通渲染可以让设计者动态调节以下效果:
(1)光在角色身上的反射
(2)角色影子颜色
(3)角色边光
皮肤shader的面板
光在角色身上的反射
光的反射颜色使用下面这张贴图来控制。
float_t normalDotEye = dot( normalVec, i.eyeDir.xyz );
float_t falloffU = clamp( 1.0 - abs( normalDotEye ), 0.02, 0.98 );
float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );
falloffU作为这张图的u值,取自法线和看向摄像机向量的夹角。
如图,角度越小,值越大。之后又被1减了一下,就反过来了。
所以结果就是,法线与摄像机的角度越小的时候,就越亮,而越大的时候,就是则是皮肤的颜色。用这张图能够有效的控制反射颜色的过渡。
角色影子颜色控制
#ifdef ENABLE_CAST_SHADOWS
// Cast shadows
shadowColor = _ShadowColor.rgb * combinedColor;
float_t attenuation = saturate( 2.0 * LIGHT_ATTENUATION( i ) - 1.0 );
combinedColor = lerp( shadowColor, combinedColor, attenuation );
#endif
LIGHT_ATTENUATION这个宏在平行光状态下是UnitySampleShadowmap(a._ShadowCoord) ,得到了阴影的值,然后把这个作为过渡值。
角色边光
// Rimlight
float_t rimlightDot = saturate( 0.5 * ( dot( i.normal, i.lightDir ) + 1.0 ) );
falloffU = saturate( rimlightDot * falloffU );
falloffU = tex2D( _RimLightSampler, float2( falloffU, 0.25f ) ).r;
float3_t lightColor = diffSamplerColor.rgb * 0.5; // * 2.0;
combinedColor += falloffU * lightColor;
法线与指向光的方向夹角越小,颜色就越亮。