前面的话
上一篇Unity酱~ 卡通渲染技术分析(一) 写了CharaMain.cginc,服装的渲染是怎么实现的。这篇来分析一下头发跟皮肤的实现
头发
本来以为unitychan的头发会有各向异性的实现,没想到她也是用的CharaMain.cginc实现的。我们来看看头发的材质
其他实现都一样,也是通过高光反射贴图来控制高光区域跟反射区域
计算法线跟视角向量的点积,这样的效果是越垂直于视角向量的高光越大,然后用RGB贴图来控制哪些区域更容易出高光
反射依然是用A通道来控制,越白的地方,反射的越强
如何实现皮肤效果
这么漂亮的皮肤,其实只用了两个效果就实现了
漫反射+边缘光
这一次我们来详细说一下漫反射的实现
float_t normalDotEye = dot( i.normal, i.eyeDir );
float_t falloffU = clamp( 1 - abs( normalDotEye ), 0.02, 0.98 );
还是用法线跟视角向量的点积,并且限制在了0.02到0.98的范围。
本来是夹角越小的值越大,夹角越大的值越小,用1 - 去点积的绝对值后,表示越靠近视角向量的,就越接近0。跟视角向量夹角越大,值也就越大,也就是边缘的部位值会越大
float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );
用刚刚求出来的值,采样的这张衰减贴图,也就是反映出皮肤质感的重要一步了!值越大,采样出的颜色就越接近肉色。也就是越边缘越接近肉色
FALLOFF_POWER 是一个衰减系数,skin shader中的值为1,也就是不衰减
再加上边缘高光
总结
unity chan的技术分析差不多完了,主要的技术特点如下:
- 漫反射是用N.V的值去采样一张衰减贴图实现的,这张贴图还可以用来实现皮肤效果
- 通过一张高光反射贴图来控制高光的细节,以及哪些区域要显示反射
- 边缘光没用菲涅尔反射,而是采样rim贴图后去乘以漫反射值得到的边缘高光
- 描边不是纯色的,采样了纹理颜色,再做了暗化处理
最后再来两张照片吧~~ 这套渲染效果其实还是蛮不错的