TressFX: Advanced Real-Time Hair Rendering
TressFX 实现的高级头发实时渲染
TressFX : AMD 开发的实时毛发模拟渲染技术开源框架

文本主要是从整个渲染管线讲述实现头发的一整套渲染方案
主要分为以下几个部分:几何拓展,光照,阴影,抗锯齿,透明度处理
几何拓展:
头发渲染的初始数据是线段,在几何阶段时会将线段拓展成一个与视平面齐平的平面,也就是常见的公告板,投影后的毛发半径还会增加一些半径保证不会因为投影过小导致在光栅化阶段消失。
光照计算:
文章中头发的光照分为两部分,漫反射和镜面反射
漫反射分量项:
t为切线方向,l为光照方向

镜面反射项:
但头发这种东西在现实上特别的地方在于他存在两层高光:

因此文章上面的光照模型上做出了改进,将高光分为了主高光和次高光:

主高光向着发梢偏移,多受到光源颜色影响。
次高光向着发根偏移,多受到毛发颜色的影响。
毛发阴影:
毛发材质的自阴影渲染一直都是问题,文章这边提出了一种近似算法。

主要参数是depth range,这个表示当先着色的毛发片元深度与对应位置的阴影贴图深度插值。
可以说相当廉价的计算方法了,基本上只要采样一次阴影贴图就可以估算阴影了。
抗锯齿:

这里的抗锯齿用的是基于覆盖率的毛发抗锯齿,计算当前像素被毛发覆盖的比例来决定当前像素毛发的Alpha 值,以此减少边缘的锯齿现象。
计算覆盖率有两种:
第一种是Ray-Cone相交测试,通过计算射线圆锥与毛发纤维的相交区域确定覆盖比例。
第二种是在图像空间抗锯齿方法是GPAA(Geometric Pixel Area Processing),也是计算覆盖比例

透明度:
头发渲染的时候一般走的是半透明渲染,而且采用了顺序无关透明技术,文章中使用的是像素链表。
文章讲述的技术其实在同书GPU PRO 5 - 1.1 和 GPU PRO 4 - 4.1 中都有相关涉及。
记录毛发的深度:
在毛发渲染中,计算毛发的光照的时候需要考虑毛发的深度,文章中拓展了这部分内容。
这里介绍了三种毛发深度的写入方法:
1,为所有毛发像素写入统一深度
2,为每个毛发像素写入精确深度
3,选择性写入精确深度
1,为所有毛发像素写入统一深度
最简单的方法,所有毛发的都同同一个深度,优点是简单,不用额外的Pass,不用额外的存储,缺点是效果差,会产生视觉伪影。
2,为每个毛发像素写入精确深度
用一个读写纹理保存距离观察者最近的毛发片元深度,然后用一个额外的Pass在渲染的时候读写该纹理。优点是能获得真实的像素深度,效果好
3,选择性写入精确深度
在 Sort and Draw 完成最终混合之后,根据最终结果判断当前像素是否足够"不透明,满足条件的像素才会写入深度
参考资料: