基于GPU 的实时毛皮渲染及优化

2022-10-15 02:08方泽华温佩贤李学阔杜晓荣
现代电子技术 2022年20期
关键词:环境光法线毛皮

方泽华,杨 林,温佩贤,李学阔,杜晓荣

(1.中山大学,广东 珠海 519000;2.金山网络科技有限公司,广东 珠海 519000)

0 引 言

毛茸茸的毛皮是自然界中大部分物体的一大重要特征,其本质是由许多非常细小的毛发所组成,数量庞大,使得计算模拟变得十分困难、复杂。因此,如何高效地渲染出具有真实感的毛皮一直是许多图形学领域不可避免的一大难题。

自2000 年来,随着硬件高速发展,许多三维动画制作采用几何建模的方式来模拟头发,使用细长的圆锥体或面片表示一根毛发,并结合高精度的光线追踪算法来模拟每一根毛发上的光照,得到了十分逼真的毛皮效果。然而,这种方法计算量十分庞大,只能应用在离线渲染中,无法满足实时渲染的要求。

为了解决毛皮实时渲染问题,需要简化毛皮模型。Lengyel 提供了一种通过多层纹理渲染模拟毛皮的方法,其原理是对每根毛发分层采样成毛发切片并记录下来,在渲染时逐层绘制毛发切片,通过多层毛发切片的像素点叠加模拟出毛茸茸的毛皮效果。其所有运算可以在GPU 下完成,得益于GPU 强大的并行运算能力,该方法具有良好的渲染效率。但是文献[5]方法的分层切片实现方法和光照计算模型十分落后,无法很好地模拟出真实的毛发且占用的绘制资源较多,还有很大的改进空间。Silva 等在上述切片方法的基础上,提出了用二维贴图记录毛发切片信息和毛发偏移,减少了绘制资源占用并模拟出了毛发的受力效果。本文将基于多层渲染方法,结合环境光遮蔽、各向异性高光等光照算法提出新的光照模型,并加以改进优化,以达到真实性与性能的平衡。

1 多层纹理渲染

如图1 所示,多层纹理渲染方法先是对表示毛发的圆锥体逐层采样,并将每一层的切片范围映射到一张二维贴图的不透明度通道上,形成不透明度由中心向外逐渐递减的噪点,表示一根毛发。渲染时,由里向外逐层绘制网格,每一层网格都是从模型表面沿着给定的偏移方向平移一定距离形成的,并且有给定的不透明度阈值,不透明度不在阈值范围内的像素点会被裁剪,以此渲染出每一层对应的切片。

图1 不透明度映射生成毛发切片

根据以上原理,生成一张充满毛发噪点的二维贴图,如图2a)所示;由内到外采样生成各层毛发切片,见图2b);如图2c)所示,逐层混合渲染后,即可获得毛茸茸的毛发效果。通过调整网格或者贴图在每一层的偏移方向,可以控制毛发的生长方向,由此可以实现图2d)中的毛发受力效果。

图2 分层渲染效果

2 光照模型

实现毛发渲染效果后,需要模拟真实的毛发光照。因为毛皮材质的特殊性,其光照模型比较复杂,下文将分别从毛发的漫反射光、环境光照、高光三方面阐述毛发光照模型的实现。

2.1 漫反射光

毛发漫反射采用经典的线性兰伯特光照模型,如下:

式中:表示法线方向;表示光照方向;k表示漫反射光的颜色;为漫反射光的光照度。

兰伯特光照模型适用于平坦均匀的表面,如图3a)所示,其渲染效果缺乏毛皮的特征。毛皮表面充满了细小的毛发,当光线照射到毛皮的表面时,由于毛发间相互遮挡,光线发生衰减,从而形成毛发间的阴影,这种现象称为毛发自阴影现象,是毛发的一大重要特征。为了模拟毛发的自阴影现象,光照强度需要逐层递减,而由于毛发之间存在缝隙,在边沿处会有一定的透光性。

为了模拟毛发的自阴影现象和透光性,需要引入2 个变量:光照衰减系数与光照通透系数,公式如下:

层光照衰减系数由外层向内层逐层递增,层光照通透系数由外层向内层逐层递减,衰减速率和通透速率控制每一层的递进速率,改进后每层切片的漫反射公式为:

如图3b)所示,改进后的漫反射光照有了毛发间自阴影,由发尖向发根逐渐变深,突出了毛发的层次感,阴影边沿处也有光线透过,显得毛发更加通透,接近现实的毛发漫反射。

图3 漫反射改进

2.2 环境光照

环境光照是指模型所在的场景中由于光的反射而出现的光照,非直射光源的光照在经典光照模型中一般是用一个光照常量或者是光照球来模拟,无环境光遮蔽的毛发图片如图4a)所示。但是由于物体间相互遮挡,环境光会有相应的衰减,环境光遮蔽技术就是用来模拟这种光照衰减。

图4 环境光照改进

由于毛发纵横交错,目前主流毛发环境光遮蔽采用体素取样的方法,通过体素划分将毛发划分成一块块小区域,并取样计算出该区域的毛发密度及深度,继而算出该区域的遮蔽因子,从而实现环境光遮蔽。

对于多层纹理毛发渲染模型,可以用层数代替深度值简化毛发切片上的环境光遮蔽因子采样计算过程,简化后每层毛发切片环境光公式如下:

式中:k为环境光颜色;为环境光的光照强度;为每一层遮蔽因子的递进速率,通过插值计算可以使每一层的颜色过渡变得更加平滑。图4b)中,加入环境光遮蔽后,毛发有了层次感。

由于毛发具有通透性,且发尖部分密度低、透光性更强,在轮廓边沿处需要补充一定的光照,因此加入Schlick 菲涅尔近似等式计算补充的轮廓光,并结合环境光遮蔽,公式如下:

如图4c)所示,结合环境光遮蔽和轮廓光后的环境光照下,毛发显得通透且富有层次感,接近与真实的毛发效果。

2.3 高 光

由于微观角度下毛发可以简化成一根直径很小的圆柱,毛发每一片切片上的高光可以视作切片上各个点的高光积分,而每一个点的法线方向都不一样,因此形成了毛发独特的高光,这样的毛发高光也就被称为各向异性高光。

针对毛发的各向异性高光,Kajiya 等基于Blinn-Phong 光照模型,提出通过向毛发切片横截面的切线方向偏移法线获取其中当前点的高光权重最大的法线,计算当前点的高光的毛发光照模型。由于横截面上有各个方向的法线,难以定位高光权重最大的法线,而毛发切片横截面的垂向方向切线垂直于横截面上的任意法线,Kajiya 以此提出使用切线与中间向量的正弦值替代计算法线与中间向量的余弦值,公式如下:

然而毛发纤维并不是单纯的光滑圆柱体,显微镜下毛发纤维表面上有着粗糙的鳞片相互层叠,鳞片结构之下是毛髓质,光线会在毛髓质内折射后再次出射,还会多次反射后再次出射,存在多条传播路径,形成毛发复杂的光照。为了模拟光线进入毛髓质之后经过折射再次出射这条光路,需要在原来高光的基础上再加一层明度偏低饱和度偏高的高光。相比于图5a)的单层高光,图5b)中改进之后的毛发高光更显真实。

图5 毛发高光改进

2.4 Gamma 校正

Gamma 校正原理如图6 所示。将上述光照模型的计算结果整合到一起后,得出如图7a)所示效果,但是在线性色彩空间下毛球的暗部过于偏暗,这是由于人对自然光照下灰阶的主观感知并不是呈线性关系,而是图6 中的幂函数关系,因此对于线性输出的色彩会产生暗部过渡偏暗和亮部过渡偏亮的感知。为了能看到正确的均匀灰阶,需要在输出时进行Gamma 校正,将色彩从线性空间转换到Gamma 空间中。

图6 Gamma 校正原理

Gamma 校正公式如下:

经过Gamma 校正后,最终效果如图7b)所示。

图7 校正前后效果对比

3 算法框架

基于第1.2 节的阐述,本文提出的实时毛皮渲染算法框架如下:

ALGORITHM 1:Real-time Fur Rendering and Lighting

Input:vertex,normal,force that effect on fur,lights that effect on fur

Output:the lighting result for each layer()

1. for= 0 to layerCount do

2. depth ←calculate the layer depth for layer

3. alpha ←CalcCurrentPixelAlpha(depth)

4. V←+ FurGrowDirection(depth,,)

5. //Calculate Lighting:

6. for every light L∈do

7. //Calculate Diffuse Lighting:

8.←calculate the fill-in light in layer

9.←calculate the light attenuation in layer

10.()←Saturate(·L+-)

11. //Calculate Ambient Lighting:

12.←CalcOcclusionFactor(depth)

13. l←Lerp(0,CalcAmbientAttenuation(depth),)

14.← Max(0,Min(1,rimBias+rimScale*((1-(·))*)))

15.()←l+

16. //Calculate Specular Lighting:

17.←Normalize(+)

18.←(1-Normalize(+primaryShift*)·)

19.←(1-Normalize(+secondaryShift*)·)

20.()←+

21.()←()+()+()+()

22. end for

23.()←LinearToGammaSpace(())

24. end for

4 优 化

毛发切片之间存在缝隙,需要通过大量层数叠加才能模拟出精细的头发效果,但是这也就导致了毛发切片所在的像素会被多次重复绘制,占用大量GPU 资源,从而在移动端等GPU 资源匮乏的硬件上造成性能瓶颈。为了解决重复绘制过多问题,需要减少绘制毛发切片的层数。原本的多层渲染中,毛发是被视作圆锥体进行切片,透明度阈值与切片层数呈线性关系,这也导致了中层到外层的切片透明度偏低,从而在切片层数少的情况下会出现失真,如图8a),b)所示。

图8 优化效果

因此需要调整切片的透明度阈值衰减曲线,采用二次曲线关系以减缓透明度阈值的衰减速度。如图9 所示,改进后衰减曲线在中上层的衰减速度明显减缓。调整衰减曲线后,中层毛发切片的透明度明显提高,如图8c)所示,优化后能以1/ 3 的层数取得不错的毛发效果,重复绘制导致的渲染压力也明显减少。

图9 衰减曲线改进

5 结 语

基于多层纹理渲染方法,结合多个光照模型,本文阐述了一种高效的毛皮渲染方法,能够很好地模拟短小毛发的光照,提高毛皮的真实感效果。同时提出了优化透明度阈值衰减曲线的方案,减少了模拟毛发所需的绘制层数,使得这种技术可适用于移动端等GPU 资源匮乏的平台中。本文研究对于毛皮材质在游戏、动画、虚拟现实等领域的应用有重要的价值。

猜你喜欢
环境光法线毛皮
基于定位法线的工件自由度判定方法及应用
单帧图像下的环境光遮蔽估计
椭圆法线定理的逆定理
基于LCD显示器光谱特性的图像颜色一致性研究
近期国内毛皮市场最新行情
近期国内毛皮市场最新行情
双曲螺线的副法线曲面的相关性质研究*
美信推出集成七个传感器的IC,可检测RGB、红外线等
智能屏变:笔记本环境感光技术
三谈等轴双曲线的典型性质