"Unity-chan" Model 的卡通渲染

发表于2018-05-28
评论0 6.8k浏览

"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;

法线与指向光的方向夹角越小,颜色就越亮。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引