半透明物体表面阴影的渲染
2015-04-06王亚楠肖双九
王亚楠,肖双九
(上海交通大学 电子信息与电气工程学院,上海 200240)
半透明物体表面阴影的渲染
王亚楠,肖双九
(上海交通大学 电子信息与电气工程学院,上海 200240)
基于阴影映射算法,提出一种半透明物体表面阴影的渲染方法.考虑半透明物体的次表面散射的光学特性,在获得阴影图后加入阴影接收表面的材质散射系数,确定随机取样的范围,使用加权平均方法计算目标点处于阴影区域的概率值,最终渲染场景.实验证明,该方法能够真实模拟半透明物体表面阴影中散影区的渲染效果.
阴影渲染;阴影映射算法;次表面散射;随机采样
在现实生活中,阴影无处不在,阴影提供了光源对物体的照射信息,它增加了人们理解三维场景的深度[1],通过阴影可以得到物体的大小、距离、高度等重要的信息,并且在一定情况下可以得到物体的材质属性.作为阴影接收者,半透明物体和不透明物体表面的阴影是有区别的.在相同光照和遮挡条件下不同材质的接受物表面阴影实物照片,如图1所示.由图1(a)可以看出,遮挡物在半透明物体表面形成的阴影边缘更为柔和,有一部分过渡区域.遮挡物在不透明物体表面形成的阴影边缘界限则比较清晰,如图1(b)所示.
产生图1中不同阴影的原因是半透明物体的次表面散射效应.次表面散射是光从表面进入物体经过内部散射,然后又通过物体表面的其他点射出的光线传递过程.半透明物体由于次表面散射导致本来处于本影区(没有光源直接照射)的一部分区域具有一定的反射亮度,在视觉上表现为阴影边缘比较柔和.将半透明表面的这一阴影区域称为“散影区”.由于散影区的存在,在相同光照和遮挡条件下,半透明的阴影接收体表面的本影区的范围会相对较小.
(a) 人造大理石表面
(b) 白色不透明表面
图1 不透明表面和半透明表面阴影
Fig.1 Shadow on opaque surface and translucent surface
在实时阴影计算方面,人们已经做过许多研究.现有的多种阴影算法可分为两大类:硬阴影算法和软阴影算法[2-5].硬阴影是指场景中的点只有在阴影中或在阴影之外两种状态;软阴影是指定义一个点,如果光源射向它的光线被部分遮挡了,则这个点位于半影区域.现在比较常用的阴影算法有阴影映射算法(shadow mapping)[2]和阴影体算法(shadow volume)[6].阴影体算法的复杂度与场景中的物体个数相关,相对于阴影映射算法而言,其复杂度较高.传统阴影映射算法生成的是硬阴影,人们基于阴影映射算法提出了一些软阴影算法,例如adaptive shadow maps(ASM)[7],perspective shadow maps(PSM)[8], percentage closer filtering(PCF)[9].其中,PCF在绘制阴影时,除了绘制该点阴影信息,还对该点周围阴影情况进行多次采样并混合来实现半影区域,ASM和PSM都是在产生锯齿的地方人为地增加采样率.在阴影映射算法中,人们根据生成的阴影图来计算阴影,场景中所有物体表面的阴影被相同对待;软阴影算法对所获得的阴影图整体进行处理,即场景中的所有物体表面的阴影使用同一算法.
但现有阴影映射算法中并未考虑阴影接收体的材质,对于整个场景中所有物体采用统一算法计算阴影.本文基于阴影映射算法,提出一种半透明物体表面阴影的渲染方法.由于光线在半透明物体内部的散射作用会在阴影的本影区的局部产生反射亮度,形成半透明物体表面特有的散影区的阴影效果.散影区域的范围由半透明物体的散射系数决定,因此在渲染半透明物体表面的阴影时,考虑加入材质的散射系数来确定所产生的散影区域范围.本文假设所用光源为点光源,遮挡物为不透明材质物体.
1 半透明物体表面阴影算法
1.1 半透明物体表面阴影分析
根据次表面散射的原理对半透明表面产生的阴影进行分析,假设点xout处应完全没有光照,即xout应处于本影区域,如图2(a)所示.如果阴影接收表面为半透明材质,如图2(b)所示,从点x1,x2,…,xn处射入的光线经过单次散射或者多次散射从xout处射出,于是点xout处具有一定的反射亮度,即点xout实际应处于散影区域,其光照亮度L0可近似表示[10]为
(1)
其中:V为物体表面所有顶点的集合;I(xi)为点xi处的光照辐射度;Fr(w0)为x0处的菲涅尔系数;F(xi)为点xi处的面积;Rd(xi,x0)定义了从物体表面上任意一点入射的光线,通过多次散射之后到达物体表面上另一点的比例.由文献[6]给出的Rd(xi,x0)的近似定义可以看出Rd(xi,x0)与distance(xi,x0)有关,距离越远的点对xout处光照亮度的贡献度越小,如图2 (b)中,Rd(x3,x0)>Rd(x2,x0)>Rd(x1,x0).当距离大于一定值时基本可以忽略不计,比如点y1对点xout处的光照亮度的贡献度可以忽略不计,这个距离由半透明材质本身内部的散射系数所决定的.
(a) 不透明物体 (b) 半透明物体
1.2 算法设计
根据1.1节的分析,这里使用简化式(2)来近似求xout处的颜色值C0.
(2)
式中:Ci为点xi处光照亮度计算值(未加入阴影计算).为节约计算成本,可将V由物体表面所有点的集合简化为xout周围一定区域内所有点的集合,区域的大小由物体材质本身的散射度来决定.
在阴影计算中,若点xout原本在本影中,则其颜色值应受周围一定区域内点的影响.在阴影映射算法中,绘制时会根据depthmap上对应的深度值来判断当前目标点是否在阴影中,如果在阴影中其v值为0,否则v值为1.根据深度测试结果可得到一幅阴影图,存储点处于阴影内的概率值.对于点xout,计算点xout周围一定区域内点在阴影区域内的概率值的加权平均作为点xout最终处于阴影区域的概率值,如式(4)所示.
C0=C·p
(3)
(4)
(5)
式中:C0为点xout处最终渲染时的颜色值;C为点xout处未计算阴影时的光照亮度计算值;n为采样点的数量;p为目标点处于阴影区域的概率值;vi为点xi处深度测试的结果值.由1.1节的分析可知,根据物体材质的散射系数来取一定的区域,以点xout为圆心和R为半径的圆区域来计算点xout处的p值,如图3(a)所示,黑色部分为本影区域,计算区域半径R由材质的散射系数s(0≤s≤1)决定,取R=16·s,不同的散射系数表示不同透明度.将目标区域分区,如图3(b)所示.圆被直线分割为N个区域,在径向将圆又划分成c个圆环,将整个采样区域分为N·c个子区域.c值应与R相等(若R为小数,向上取整),N为常数.当然,N取值越大,采样点数目会越多,计算结果会越精确,计算量也会随之增大.本文设置的N值为6,如N<6则渲染出来的阴影粒子感比较明显.假设散射系数为0.5,求得R值为8,那么采样区域的子区域数量为48.为减少计算量,采用随机取样[11]的方法在每个子区域中选取一点,如图3(b)中的×点,那么计算目标点阴影参数时的采样点数目为48,对这些点使用式(4)来计算点xout处于阴影内的概率值.
(a) 以xout为圆心
(b) 对目标点周围进行分区
为验证这一采样方案的有效性,将不同采样点数量计算得到的阴影效果做了对比实验,结果如图4所示.由图4可以看出,两幅图中的阴影区域基本相同,说明本文采样方案在精度和计算量之间的平衡是较优的.
(a) 采样点数目为48
(b) 采样点数目为120
1.3 算法步骤
本文提出的半透明物体表面阴影算法主要包含以下步骤:
(1) 以光源位置为视点,将场景的深度信息渲染到纹理中,生成阴影映射图;
(2) 以相机位置为视点,使用步骤(1)中获得的深度纹理来进行阴影测试,通过比较给定点在光源空间中的深度值与该点在深度纹理中的深度值关系,判断该点是否处于阴影中,将判定结果存于纹理中,称为阴影图;
(3) 使用随机取样方法对上一步获得的阴影图进行模糊处理,其中随机取样的范围为圆形区域,圆形区域的半径R由半透明物体的散射系数计算,本文取R=16·s(0≤s≤1);
(4) 以相机位置为视点,根据步骤(3)中处理后的阴影图渲染整个场景.
2 实验结果
本文实验在一台Intel Core i5-2300 2.8 GHz CPU, 内存8 GB,NVIDIA GeForce GTX 570显卡的机器上进行.基于Open GL 4.0,使用GPU的顶点渲染器和像素渲染器功能,在VS 2012编程环境下实现本文算法.
实验的场景中包含背景平面和一个点光源,遮挡体为一个不透明的圆环,阴影接收体是一个半透明材质的茶壶.
2.1 渲染半透明物体
对半透明物体的渲染方法,人们已经做过很多研究,现有的算法有空间动态可变材质的交互式全局光照方法和高斯核模拟方法[12-13].为减少相关的计算量从而获得更快的渲染速率,本文渲染半透明物体使用fake sub-surface scattering shader[14].在算法的具体实现时,给材质添加了散射系数s,s为0时表示不透明物体,使用Phong光照模型计算物体表面颜色值,如图5(a)所示;s不为0时表示半透明物体,使用fakesub-surfacescatteringshader来进行渲染,如图5(b)所示;使用本文提出的阴影算法计算阴影,如图5(c)所示.
(a) 使用Phong模型渲染不透明 物体
(b) 使用fake sub-surface scattering shader渲染 半透明物体
(c) 加入阴影计算的半透明表面阴影
2.2 渲染半透明物体表面阴影
利用不同阴影算法渲染相同场景的实验结果如图6所示.其中,图6(a)使用传统阴影映射算法,可以看到阴影边缘界限明显;图6(b)使用2×2的百分比接近滤波(PCF)软阴影算法,可以看到阴影的边缘比图6(a)中阴影平滑;图6(c)使用本文提出的半透明表面阴影算法,可以看到半透明茶壶表面阴影边缘具有散影区域,即明显的软阴影部分,而背景墙面上的阴影不具有半影区域,因为茶壶散射系数为0.80,墙面的散射系数为0,根据材质的散射系数渲染不同表面的阴影.
本文的半透明表面阴影算法通过改变s值渲染相同场景的实验结果如图7所示.由图7可以看出,随着散射系数的增大,阴影边缘的散影区域也在增大,并且阴影更加柔和.
(a) 阴影映射算法
(b) PCF算法
(c) 半透明物体表面阴影算法
(a)s=0.15
(b) s=0.50
(c) s=0.80
本文算法在半透明和不透明小牛上产生的自阴影渲染图如图8所示,其中墙面的散射系数为0.由图8可以看出,半透明小牛模型在自己表面形成的自阴影边缘更加柔和,即为软阴影,不透明小牛表面形成的自阴影边缘很明显,两幅图中小牛在墙面上形成的阴影是相同的.
(a) 半透明小牛
(b) 不透明小牛
3 结 语
本文提出了一种半透明物体表面阴影渲染的改进算法,加入阴影接收表面材质属性信息,并使用次表面散射算法,确定对目标点颜色值有贡献度的点所在的区域,采用随机取样的方法在该区域内采样进行计算,模拟遮挡物在半透明阴影接受体表面形成的阴影.从实验渲染结果可看出,使用本文算法渲染出的场景中半透明物体表面阴影具有散影区域,更接近真实场景.
本文假设光源为单光源,并且遮挡物为不透明物体,在下一步的工作中需要考虑光源为多光源以及遮挡物也是半透明物体情况下如何计算其在半透明阴影接收表面所形成的阴影.
[1] 何援军.计算机图形学[M].北京:机械工业出版社, 2006: 197-198.
[2] WILLIAMS L. Casting curved shadows on curved surfaces [C]//Proceedings of SIGGRAPH’78. 1978:270-274.
[3] LOKOVIC T, VEACH E. Deep shadow maps [C]//Proceedings of SIGGRAPH’2000. 2000: 385-392.
[4] JENSEN H W, MARSCHNER S R, LEVOY M, et al. A practical model for subsurface light transport [C]//Proceedings of SIGGRAPH. 2001: 511-518.
[5] WOO A, POULIN P, FOURNIER A. A survey of shadow algorithms [J]. IEEE Computer Graphics & Applications, 1990, 10(6): 13-31.
[6] BERGERON P. A general version of crow’s shadow volumes [J]. IEEE Computer Graphics & Applications, 1986, 6(9): 17-28.
[7] FERNANDO R,FERNANANDEZ S,BALA K , et al. Adaptive shadow maps[C]//Computer Graphics Proceedings,Annual Conference Series,ACM SIGGRAPH. Los Angeles,California,2001:387-390.
[8] STAMMINGER M, GEORGE D. Perspective shadow maps[C]//Computer Graphics Proceedings,Annual Conference Series,ACM SIGGRAPH.San Antonio,2002 :557-562.
[9] REEVES W T,SALESIN D H,COOK R L. Rendering antialiased shadows with depth maps[J]. Computer Graphics,1987 ,21(4):283-291.
[10] STAM J. Multiple scattering as a diffusion process [J]. Proceedings of Euro Rendering Workshop, 1995, 6(1): 41-50.
[11] WOLFF D.OpenGL 4 shading language cookbook[M]. Birmingham:Packt Publishing Limited, 2011:251-257.
[12] 孙鑫,周昆,石教英.空间动态可变材质的交互式全局光照明绘制[J].软件学报,2008,19(7):1783-1793.
[13] NGUYEN H.GPU Gems 3[M]. New Jersey: Addison-Wesley Professional, 2007: 223-263.
[14] Toneburst. GLSL translation of this fake sub-surface scattering shader by invalid pointer. [EB/OL].(2008-10-29)[2014-08-15]. http://machinesdontcare.wordpress.com/2008/10/29/sub surface-scatter-shader/.
Rendering Shadows on Translucent Objects Surface
WANGYa-nan,XIAOShuang-jiu
(School of Electronic Information and Electrical Engineering, Shanghai Jiaotong University, Shanghai 200240, China)
Based on shadow mapping, an algorithm of rendering shadows on translucent objects is presented. Considering sub-surface scattering optical properties of translucent objects, after getting the shadow map, this algorithm uses the scattering coefficient of translucent objects to determine the scope, then computes the probability value of the target point, renders the scene at last. Experimental result shows that the method can simulate the scatter shadows on translucent objects realistically.
shadow rendering; shadow mapping; sub-surface scattering; random sampling
1671-0444(2015)05-0646-04
2014-11-16
国家自然科学基金资助项目(61173105, 61373085)
王亚楠(1990—),女,江苏南通人,硕士研究生,研究方向为计算机图形图像. E-mail:wyn_double@163.com 肖双九(联系人),女,副教授,E-mail: xsjiu99@cs.sjtu.edu.cn
TP 391
A