查看原文
其他

程序丨萌娘登场!"Unity-Chan" Model 的卡通渲染

小yue 腾讯GWB游戏无界 2022-08-30

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



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


今日推荐

如何修改Unity变量名但不丢失序列化值?

新手入门:如何用Laya开发微信小游戏?

末日科幻风!加拿大艺术家Florent Lebrun场景作品欣赏

一键添加

加小编微信回复“程序”,享双重福利

1.加入GAD程序猿交流群,获取行业干货;

2.领取60G腾讯内部分享等独家程序资料。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存