unity布料自碰撞_Unity的PBR扩展——皮毛材质

ff53dbcbe1b4f46c198e363f8629125e.png

最近被王者荣耀的一篇毛发制作文章刷屏:

真香预警!新版“峡谷第一美”妲己尾巴毛发制作分享​mp.weixin.qq.com
5d107a147a18e2178b77ed89420bbe17.png

本文参照其介绍的方法先实现无光照的皮毛,然后再进行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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值