Volumetric Level Set Hair Workflow
Abstract : 事实上,对于搞定了PIXAR的2006年发布的一个小小的毛发流程,我一点都不觉得有什么丢人之处。微积分是几百年前的东西,量子力学是一百年前的东西,Level Set是将近三十年前的东西,我们都是站在巨人的肩上才能向前卖出一小步的。In fact, I did not feel there is something disgrace that I duplicated this little hair workflow. The integral was invented several hundreds years ago, the Quantum physics owned about one hundred years history, the Level Set was published since thirty years ago. We are all standing on the should of giant in order to get a small step forward.
PIXAR的《Volumetric Methods for Simulation and Rendering of Hair》这个篇文章中所展示的毛发小流程主要是五个部分组成
- Key-Hair的创建(无论是用商业软件Shave,还是利用《A Thin Shell Volume for Modeling Human Hair》一文中的方法)
- 制作Tent Field(在这里我使用CUDA加速大幅度的提高了效率)
- 根据Tent Function与用户指定的Density计算出Level Set的Signed Distance Function(PDE迭代法或者是FMM)
- 利用Implicit Surface Plugin绘制出SDF的外壳用
- 在Shader中直接获取Gradient进行毛发的“伪法线”着色
第一步没什么好说的,完全的艺术导向性制作。不过我还是觉得Houdini的毛发系统比较有意思。
第二步经过测试发现使用CPU做累加效率实在是很低,尝试用GPU计算后发现效率大幅度的提高。感谢thrust使得快速实现成为可能。
第三步,由于这个3D网格可能非常的精细,导致基于GPU的PDE迭代求出SDF的方法变得越来越不可接受,经过测试发现基于CPU的FMM方法效率完全可以满足要求。
为了实现第四步我手写了一个读取外部3D纹理的RenderMan Implicit Surface Plugin。
第五步没什么意义,因为简单的Kajiya-Key模型外加许多成分往往就已经足够,艺术家还好进行调整。
Preview in Maya
RenderMan Curve (inflated width of curve)
Iso Surface
事实上做这个壳许多情况只是为了解决一个毛发对模型的近似投影问题。如果使用RT则不需要,但是如果使用Deep Shadow则就会出现Bias数值的问题。利用这个Implicit Surface可以近似代替无数根毛发的投影。