gpu gems——第23章 头发动画和渲染

https://developer.nvidia.com/gpugems/GPUGems2/gpugems2_chapter23.html
我们要实现的目标是渲染长的,金色的,流动的水下头发。这节介绍实现实时渲染目标的一些技术。包含一个仿真头发运动的系统,一个计算头发自阴影的算法,模拟单个头发的光散射的反射模型。结合起来,这些元素生成逼真的头发图像。
在Nalu头发着色器后台,有一个系统生成头发的几何体并控制动力学碰撞的计算。
头发由4094根单独的发丝用线元构成,我们用123000个点渲染头发。用动力学和碰撞检测发送这么多顶点会很慢,所以我们用控制毛发:Nalu的发型可用一个几百个头发的更小集合描述和控制。我们没有时间也没有工具一个个手动地控制这些头发的运动,即使有,控制这么多控制头发的动画也特别困难。为了让头发看起来更真实,需要用到许多微小的二次运动。基于物理的运行比较有效。
当然,当程序动画被引入时,一些对头发运动的控制失去了(在我们的情况下,这意味着失去了90%的控制)。碰撞检测和响应可以引入妨碍了创造性的动画的不希望的头发行为。我们的动画师在理解动力学的内部运作方面做得很好,并创造了一些变通方法。一些额外的工具被引入到引擎中获得另外10%的动力学控制。

头发几何体

布局和增长

控制头发结构主要来描述发型。我们在maya生成的代表头皮的几何体的基础上生长控制头发。控制头发从头皮的每个顶点向外生长。生长是100%程序化的。
gpu gems——第23章 头发动画和渲染_第1张图片

控制头发

一旦我们有了一套控制毛发,我们就会让它们受到物理、动力学和碰撞计算的影响,从而使头发通过程序动起来。这个demo中,运动主要依赖于动力学。尽管这个系统看起来很引人注目,但是人为控制的系统更好。

数据流

因为头发是完全动态的,每帧都会动,我们需要在每一帧重新绘制最终渲染的头发。下图显示了这个过程中数据是怎样流动的。
gpu gems——第23章 头发动画和渲染_第2张图片
动画控制头发被转换为bezier曲线并细分成更平滑的线。平滑的线被插值增加头发厚度。我们用一个动态顶点buffer存储顶点数据

细分

头发细分包括通过增加顶点来平滑每个控制头发。我们提高了5番,从7个顶点到36个。下图是Nalu头发的创建过程
gpu gems——第23章 头发动画和渲染_第3张图片
下图是细分和插值的效果图
gpu gems——第23章 头发动画和渲染_第4张图片
为了计算新加入节点的坐标,我们通过计算控制头发的切线将控制头发转换为bezier曲线,用他们计算Bezier控制节点。通过bezier曲线,我们计算用来平滑头发控制节点的顶点坐标。
平滑后的控制头发会被插值复制,形成一头厚厚的头发,为最终渲染做准备。

插入

头发的插值用了头皮网状拓扑。每个三角形的边上有三个平滑的控制毛发(如绿色)。我们想要用头发填充三角形表面的内部,所以我们插入控制毛发的坐标来创造新的平滑的头发(用灰色显示)。光滑的控制毛发和光滑的插值毛发有相同数量的顶点。如下图所示
gpu gems——第23章 头发动画和渲染_第5张图片
用了重心因子来创建新插入的毛发,比如插入的头发Y是基于3个和为1的重心因子 (b A , bB , bC )计算的:

Y = A x bA + B x bB + C x bC .
生成两个(0, 1)之间的随机数,如果他们的和大于1,计算1-它们中较大的数,将第三个数设为1-另外两个的和。

动力学和碰撞

Nalu的头发动力学是基于粒子系统的。

头发shadering

头发的shader可以分为两部分:头发的局部反射模型和计算发丝之间自发光的方式。

头发的实时反射模型

我们用Marschner et al. 2003的局部反射模型。因为它是一种全面的、以身体为基础的头发反射。
Marschner反射模型由一个四维双向散射函数构成:

S( i , i ; o , o ),

i属于 [– /2, /2] and i 属于[0, 2]是极坐标下的输入方向。o 属于 [– /2, /2] and o 属于U220A.GIF [0, 2]是极坐标系下的光照方向。这个函数描述了头发纤维散射和反射光的完整描述,如果我们可以计算这个函数,我们就可以计算每个光照位置的阴影。
由于S的计算比较复杂,我们想要将S存到一个查看表里,在运行的时候读取。查看表可以存到一个贴图里,运行时从像素shader中读取。而贴图是二维的,S函数需要4个参数,就需要我们小心设计查看表。

Marschner反射模型

Marschner模型将每一根头发纤维视为一个半透明的圆柱体,并考虑到可能穿过头发的路径。有3种路径,每种路径都代表了一种光的路径,代表了光射线和物体表面的交互。R路径代表从头发表面发射到观察者的位置。TT路径代码光折射进头发又从头发折射出来到观察者。TRT路径代表光折射进入头发纤维,在头发内表面反射,然后又折射出来到观察者。这3种路径名中,R代表光反射,T代表光从一个表面反射。

你可能感兴趣的:(unity,shader入门精要)