最近被王者荣耀的一篇毛发制作文章刷屏:
真香预警!新版“峡谷第一美”妲己尾巴毛发制作分享mp.weixin.qq.com本文参照其介绍的方法先实现无光照的皮毛,然后再进行PBR扩展,最终实现题图的皮毛效果。
层渲染技术
根据模型使用层 (layer) 来渲染毛发长度,
在 Unity Shader 中,
每一个 Pass 即表示一层。
当渲染每一层时,
使用法线将顶点位置挤出模型表面 。
然后将Noise贴图根据layer做衰减,
来当做alpha值。
实现原理本文就不再详述,这里列出一些实现细节。
1. Shell层
向外突出的层通过在顶点着色器中对顶点位置沿法线做偏移达到,多层的效果需要用当前层作为偏移系数,使pass越靠后的层,向外偏移的越多:
v.vertex.xyz += v.normal * _FurLength * FUR_OFFSET;
其中FurLength为总的一个scale变量,FUR_OFFSET为层相关的参数,接下来介绍。
2.Alpha值
层的渲染模式设置为透明渲染。为了符合毛发根部粗,尖部细的特点,所以层越往外,隐藏的部分(alpha值为0)应该越多:
alpha = step(FUR_OFFSET, alpha);
其中FUR_OFFSET值为当前层/总层数,这样FUR_OFFSET值在0到1之间变化。假设渲染20层,那么由里向外的层FUR_OFFSET值依次为0、0.05、0.1 …… 0.9、0.95、1。alpha值读取自layer贴图,后面介绍。
这样实现的头发形状就是如下图左的三角形。下图右的抛物线形状,需要修改step的裁剪边界成非线性:
alpha = step(FUR_OFFSET*FUR_OFFSET, alpha);