《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于GPU的动态头发渲染
基于GPU的动态头发渲染
来源:微型机与应用2012年第3期
毛 伟,陈利学
(西南石油大学 计算机科学学院,四川 成都 610500)
摘要: 运用模拟头发运动的系统计算头发阴影的阴影生成算法和一个通过每一串头发来模拟光线散射的发射模型,就可以创建出极其真实的头发影像。渲染结果表明,利用以上方法可以渲染出极其逼真的头发。
Abstract:
Key words :

摘  要: 运用模拟头发运动的系统计算头发阴影的阴影生成算法和一个通过每一串头发来模拟光线散射的发射模型,就可以创建出极其真实的头发影像。渲染结果表明,利用以上方法可以渲染出极其逼真的头发。
关键词: GPU;发射模型;头发影像

 头发渲染在图形图像渲染中越来越受到人们的关注。在当今人体虚拟和仿真技术里,头发可以给人体模型一种真实感,而且在电影和动画游戏领域里都有广泛的应用。动态三维头发渲染一直是计算机图形学的一大难题,头发的最终形态、光泽度、颜色以及种类数量都是非常难以控制的。本文讨论了基于GPU编程技术的高质量动态头发实时渲染,其中主要讨论和解决了动态头发的建模、动力学和碰撞以及最终的着色渲染几个关键问题。
1 动态头发的建模
1.1 控制头发

 受控发丝的结构用于粗略地描绘整个发型。从Maya内建的表示“头皮”的专用几何体(渲染时不可见)“生长”出受控发丝。受控发丝从头皮的每个顶点沿着法线生长出来。为了程序上能让头发运动,一旦有了一组受控发丝,就让它们服从物理、动力学和碰撞的计算。在模拟头发运动的系统里,运动完全依赖于动力学,它是一个人工控制系统,需要能“假造”或者“修正”头发的行为。
1.2 数据流
 头发几乎每一帧都有动作和变化,所以需要在每一帧中重建最终渲染头发的集合。要得到平滑曲线,首先将动态受控的受控发丝转换成贝塞尔曲线,并镶嵌成平滑线条,然后通过插值来增加头发的密度,插值后的头发集合被送到引擎来做最终帧的渲染。其中使用了一个动态的顶点缓冲区来容纳这些顶点数据。
1.3 镶嵌和插值
1.3.1 镶嵌

 头发的镶嵌处理是通过在每根受控发丝上添加顶点以平滑化受控发丝来完成的。这会增加5倍以上的顶点,从7个顶点增加到36个顶点。为了计算新顶点的位置,计算切线并使用这些切线来计算贝塞尔控制点,将受控发丝转换成贝塞尔曲线。通过贝塞尔曲线,计算额外顶点位置,从而使受控发丝更加平滑。经过平滑处理的受控发丝通过插值来复制,以生成一把稠密的头发,为最终渲染作好准备。
1.3.2 插值
 插值的头发是由头皮网格拓扑来生成的,如图1所示。每个三角形的末端都会有3条平滑的受控发丝,要把三角形内部的表面用头发丝来填充,所以把受控发丝的坐标每3个一组地进行插值,以构造新的平滑头发。平滑的受控发丝和插值的头发具有同样数量的顶点。利用重心坐标来生成新的插值发丝,填满每一个三角形。如插值头发K是基于3个重心系数(X1,X2,X3)来计算的,其中,X1+X2+X3=1,且K=A×X1+B×X2+C×X3.
 在区间[0,1]里生成两个随机数,若它们的和大于1,则用1减去较大的数,然后用1减去这两个数得到第3个数,所以这3个数的和就为1,这样就可以确定生成密集头发的位置了。
2 动力学粒子系统
 头发的动力学是基于粒子系统的,把每一根没有插值的受控发丝的顶点当成一个粒子运动。这些粒子不是均匀分布在一根头发上的。这些受控发丝上的片段随着和头颅距离的增大而增大。这样,不必添加太多的顶点就可以生长出更长的头发。对于这个粒子的运动,利用Verlet积分来计算,它简单而且稳定。在粒子不停移动的同时,受控发丝的长度也必须保持不变,以免拉伸。因此,在受控发丝的粒子之间使用一些约束条件。若粒子靠得太近,这些约束条件就会使它们相互排斥;当它们距离太远时,会使片段缩短。当然,当拉开一个粒子时,与之邻接片段的长度就会变得无效,所以这样的修改就会重复地使用。当多次迭代之后,这个系统就会向期望的结果收敛,最终保持发根长度为常数。为了保证头发看起来真实,最后就是头发的碰撞问题。在头发的碰撞检测中,受控发丝的碰撞数据中引入一种“珍珠结构”,利用球体来进行碰撞检测,每个球体会与另一个定位在粒子上的球体碰撞,而不是与一个点碰撞。
3 头发的着色
 头发的着色问题可以分成头发的局部发射模型和计算头发之间的自阴影的方法两部分。
3.1 用于头发的实时发射模型
 局部反射模型选用Marschner模型,它是一个全面的基于物理的头发发射表示。Marschner反射模型可以通过一个四维的双向散射函数来阐明:

 函数S完整地描述了一根毛发纤维是如何散射和反射光线的。计算这个函数,就能计算出在任何光源位置的表面着色。计算S的开销较高,为了避免对每个像素都进行计算,把S的结果保存在查找表里,在运行时读取,这个查找表就可以编译成一个纹理,并可以在Pixel shader中访问。但函数S有4个参数,而GPU本身是不支持四维纹理的。把1个四维函数编码成二维纹理,小心地处理查找表,就能仅用1个较小的二维映射来对四维函数进行编码。
 Marschner模型把每根独立的毛发纤维当作半透明的圆柱体,并考虑可能穿透头发的光线路径。对于3种类型的轨迹,每种都按轨迹符号给了不同的标记。每一道光都以一个字符串来代表其光线和表面的相互作用的类型。R轨迹表示从头发纤维表面反射出来的光向着观察者;TT轨迹表示光折射入头发,而且再次折射出的光向着观察者;TRT轨迹表示光折射入头发纤维,在内表面反射,再次折射出的光向着观察者。其中,“R”表示光线反射,“T”表示光线穿过表面的折射。图2展示了这3种反射轨迹的头发外观。

 

 



 最后,从光学密度上计算传递,得到一个在0~1之间的值来表示光源到达点(x,y,z)的光照分量。把着色值乘上这个值来得到头发的最终颜色。
本文演示了从动力学来渲染和着色头发,不透明阴影图除了对渲染头发非常有用,还能用在深度图失效的情况。随着GPU越来越灵活,它不仅能承担典型的并行任务(如镶嵌和插值),也包括CPU涉及的碰撞检测和物理设置,从而达到较为逼真的渲染效果。最后希望在下一代程序里可以看到更逼真的头发。
参考文献
[1] GREEN S. Real-time approximations to subsurface scattering [A]. In GPU Gems, edited by Randima Fernando, 2004:263-278.
[2] KIM T Y, NEUMANN U. Opacity shadow maps[C]. Proceedings of SIGGRAPH2001, 2001:177-182.
[3] MARSCHNER S R, JENSEN H W, CAMMARANO M, et al. Light scattering from human hair fibers[C]. ACM Transactions on Graphics-Proceedings of SIGGRAPH 2003,2003,22(3):780-791.
[4] MCCOOL M D. Homomorphic factorizations of BRDFs for high-performance rendering[C]. Proceedings of SIGGRAPH 2001, 2001:171-178
[5] 唐勇,刘强,吕梦雅.一种头发动态模拟方法[J].计算机仿真,2006,27(7),211-213.

此内容为AET网站原创,未经授权禁止转载。