: 难道是要 同一只动物模型复制三层 然后同时绑同一个骨架骨架
: 外面几层用透明毛发材质吗...?
就我所知的方法有三种
方法一就是土法炼钢
在建模工具理面自己手动作出不同毛发层
优点是每层都可以精确手动控制
缺点就是...费工,而且不方便与动态毛发效果整合
方法二是把方法一的手动部分搬到vertex shader或geometry shader
用vertex shader的话,就是同一个mesh画多次
每次画的时候传入vertex shader的毛发参数逐渐改变
例用毛发长度参数和normal,把vertex往外推出层新的一层
另外搭配毛发粗细参数、密度、乱度在每一层的渐变,调出想要的效果
用geometry shader就是把上数的多次绘制
结合成一步,一次生成所有毛层,再一次绘制
http://www.xbdev.net/directx3dx/specialX/Fur/
http://www.catalinzima.com/xna/tutorials/fur-rendering/
方法三是ray marching
用手动方式或geometry shader把mesh复制一次,往外推到最外层
然后在pixel/fragment shader阶段用ray marching的方式计算每个像素的颜色
原理是从摄影机往每个像素的射线逐步推进取样
搭配mesh的毛发材质代表的参数反推毛发占据的空间
两个射线取样如果从毛发空间中穿过
表示该像素需要绘制毛发,接下来从取样位置和毛发参数推算最终颜色
https://www.shadertoy.com/view/XsfGWN
方法一和二因为是实质上分层的关系
近看会有看得到多层平面的瑕疵
而ray marching的分层瑕疵则是来自于射线取样过疏
解决方是当然就是增加层数或者降低射线取样间距
这就要在效果跟效能之间取平衡了
这也凸显了方法二和三的动态调整优势
方法一就只能手动增减层数,方法二和三可以调整个参数就了事
没有做过效能比较,这个有兴趣就得自己去研究了
以上