真实感海下光照效果实时绘制

2018-10-17 12:25吕梦雅周升腾
小型微型计算机系统 2018年10期
关键词:纹理阴影光照

吕梦雅,刘 丁,唐 勇,李 颖,周升腾

(燕山大学 信息科学与工程学院,河北 秦皇岛 066004)

(河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004)

1 引 言

虚拟海洋场景的实时绘制在计算机图形学研究中既是热点又是难点.它在海洋勘测、灾害救援、主机游戏、影视特效等方面起着重要的作用.海洋场景的仿真包括海面与海下,国内外研究成果多集中于海面模拟领域,在海底场景实时绘制方面则略显匮乏.随着人类对海下资源的开发和利用,进行海下场景的仿真具有重要的现实意义.

海下光照的仿真涉及到海水与光照交互无疑更加具有挑战性.其中主要包括以下两点:

1)光与水分子、悬浮颗粒和有机物质相互作用产生复杂的光束、阴影、焦散等现象;

2)海下场景会受到海下深度、海水浓度、海水散射等影响呈现不同的色调.

2002年,东京大学Iwasaki等通过累积光条纹的强度来实现水下体积光效果,使用阴影贴图技术实现光束照射对象的阴影[1],但计算每个三角网格折射体积光太过耗时并不能实现海下场景的实时模拟.2007年,MA Shah等人提出一种基于焦散映射的方法实时渲染来自反射和折射对象的焦散[2],但文中并未涉及到体积光的实现.2009年,雅典经济与商业大学Papadopoulos等使用绘制线条的方法来模拟体积光效果[3],然而该方法由于线条光栅化的限制,需要提高光线的采样次数.2010年,北京化工大学胡威等提出一种用于单散射参与介质的体积光焦散渲染方法[4],但这种方法仅适用于较小的水下场景.2011年,麻省理工学院计算机图形组Liktor等提出一种自适应可扩展光线追踪单散射体积光渲染的算法[5],但只是实时绘制小规模水体下的体积光.同年麻省理工学院Jiawen Chen 使用加速度结构(1D min-max mipmap)[6],快速找到与一对切片中所有像素平行的细分光,但是并未涉及到体积光的绘制.2016年,燕山大学唐勇等[7]通过优化菲涅尔反射系数求解方法将反射图和折射图渲染到纹理中实现水面折射效果,但没有考虑具体的海下光照现象.2016年,皮克斯动画工作室Daniel Chang等人在Houdini平台下采样焦散纹理图模拟焦散现象[8],但采用离线渲染方法,很难达到实时效果.2016年,威廉姆斯大学M Mcguire等提出一种实时光栅化算法模型在GPU上实现焦散、阴影等现象[9],但并未应用在水下光照渲染.

综上,本文提出一种基于改进光线追踪的实时有效绘制光照模型.通过该模型实现光线透过海面在海中的漂浮物、颗粒物等粒子形成的体积光、阴影、焦散等效果.再次,引入散射相位函数和能量守恒定律解决海水在不同深度下对光照散射的影响,提高了光在水中传播的真实性;最后,加入了线性八叉树算法对光线追踪算法进行优化加速,保证了海下光照模型的实时性.

2 海下光照模型的构建

2.1 体积光建模

目前体积光建模方法很多,如BillBoard贴片法、径向模糊法、以及文献[1]中累积光条纹的强度方法等.BillBoard贴片法由噪声贴图添加遮罩生成,只能实现部分区域的体积光;径向模糊法要求过多的CPU计算,且体积光效果并不明显;文献[1]通过计算光线透过海面发生折射前后的光线强度方法获得体积光效果,由于要计算每个光线透过的三角网格的光强总和,因此这种方法非常耗时,并不能实现实时模拟.本文为简化计算量,选择累积折射后的光线强度的计算方法,并通过线性八叉树算法进行加速计算,从而保证实验的实时性.

图1 不同方法的体积光效果Fig.1 Volume light effects of different methods

2.1.1 求解亮度值积分

由于光的传播特性是按距离增加而衰减.光的亮度和离光源的距离成平方反比.因此得到一个基本的衰减公式为

(1)

其中,i为采样点处光照强度,d为距离,I为光照强度,这里得到的只是一个采样点处的亮度值,为了获得所有采样点的亮度值,需要对所有采样点的亮度值进行积分求和.如图2所示.

S为光源位置,C为摄像机(视点)位置,O为物体位置,t1、t2、t3、t4分别为四处采样点,此处设函数L(t)为采样点t处

图2 采样点亮度值求和Fig.2 Summation of sampling brightness values

亮度值,函数x(t)为视线的积分曲线.可得公式为

x(t)=rc+t*rd

(2)

其中rc为视线起点,rd为视线方向,将函数x(t)代入L(t)中得到

(3)

其中S为光源位置,海水深度为d,我们需要求得L(t)从0到d的积分,则由上述两式可得

(4)

2.1.2 透光比计算

太阳光进入水中会发生折射,折射后的太阳光能量不断衰减,光能量的衰减一般使用透过率来表示,因此在光线跟踪算法中加入透过率,使海下光照更加符合光学特性.根据比尔朗伯定律(Beer-Lambert Law)可知,传输途径损耗的能量与光通过的距离成正比,其表达式为

dIλ=-Iλφ(λ,z)dz

(5)

其中Iλ是入射到dz所在面上的辐射通量的密度,比例因子φ(λ,z)称为消光系数.设光线通过的距离为Q(x,y,z)则上式可以得到传输后的光辐射通量密度表达式为

(6)

其中Iλ0是在入射面z0处的通量密度;在指数中的积分部分为光学厚度,一般用τ表示.因此上式可化简为Iλ=Iλ0exp(-τ),只需获得传输路径上海水的消光系数,即可得到相应的透过率.

(7)

2.2 阴影绘制

光线追踪算法中对阴影的计算准确、真实,但由于计算量过于巨大,不能实时绘制阴影,为兼顾阴影的真实性与实时性,本文采用阴影映射技术(Shadow Mapping)结合光源视角下渲染的阴影贴图实现阴影的实时绘制.

在光源坐标系下,将整个场景渲染到一张纹理图上,并把视点从光源视角转为正常视角,再对整个场景进行渲染,并将渲染得到的投影坐标系下的深度值保存至纹理,从而获得一张大小为512×512的深度图 (Shadow depth map).获取深度图和阴影贴图(shadow map)之后,将深度图和阴影贴图中的深度值进行对比,如果深度大于阴影贴图的深度值,那么就说明在阴影之中.最后通过采样深度图完成对场景阴影的渲染.

2.3 焦散效果

基于物理的焦散效果真实但实时性差,为获得较为真实且实时的焦散效果,本文采用纹理映射方法来渲染.将焦散接受体(海底地形和其他物体)顶点变换到光源坐标系中,用投影得到的纹理坐标对焦散图采样,然后将采样结果与焦散接受体的颜色融合或叠加,并根据焦散的接受体与视点的距离对颜色进行衰减.用于采样焦散图的纹理坐标可通过矩阵Mtexture变换焦散接受体的模型坐标得到如下公式:

Mtexture=MbiasMprojMviewMmodel

(8)

Mmodel是焦散接受体的模型矩阵,Mview是光源的观察矩阵,Mproj是焦散图矩阵,Mbias矩阵用于将纹理坐标值缩放为[0,1].

由实验结果可知,使用纹理映射技术可以模拟不同地形下的焦散效果,并且在海下场景实时绘制中依然可以保持很高的帧率.

2.4 海水散射模型

传统海水散射通常使用雾化效果粗略表现,效果不够逼真.为了解决光线散射问题,这里引入Henyey -Greenstein散射相位函数作为海水散射相位函数表现海水的散射效果,符合真实的海水散射效果.具体公式如下:

(9)

θ为视线方向和光线入射方向的夹角(散射角),p(θ)为视点方向的散射光线亮度.g值为前向相位函数非对称因子,代表介质散射性质.通过H-G公式对视角区域内平面的所有像素进行计算.根据视角区域内平面任意像素点的几何位置P值、视点位置及光向量可计算出散射角θ,代入H-G公式求出p(θ).以上方法可逼真的表现出海下光照散射效果.

3 线性八叉树算法

本文引入线性八叉树空间剖分算法提高折射后的太阳光与线性八叉树节点间的碰撞检测速度.将包含整个场景的大立方体分割成八个子立方体,若子立方体中所含场景面片数大于给定的阈值,则按照上述方法进一步划分,直至子立方体中场景网格面片数小于阈值.

线性八叉树的深度是立方体所能分割的最大次数.假设线性八叉树深度为N,则任意一个终节点的编码是

其中,q1,q2,…,qi{0,1,2,…,7},F为异于0,1,2,…,7的符号(0≤i≤N).由上述节点方式找到空间任一点所在的空间网格单元.设P(x,y,z)为空间内一点,x,y,z取整数,其相应的二进制表为

x=i1i2…iN,
y=j1j2…jN,
z=k1k2…kN,
il,jl,kl∈{0,1},l=1,2,…,N

(10)

通过计算前左下角坐标Q点是否位于第一个立方体边界上和光的前进方向判断光是否射出场景,若光线射出场景,则结束算法.否则,在空间线性八叉树的节点表中查找P,直至光线射出场景.

4 实验结果与对比分析

在Windows10系统下结合Unity3D平台建立实时海下光照模型,并进行实验与对比,充分验证海下光照的真实感与实时性.硬件环境:Intel(R) Core(TM) i7-4790 CPU @3.60GHz,16GB,显卡为GeForce GTX 750Ti (2GB/NVIDIA).

图3中,(a)为本文建立的海下光照模型的实验效果图,(b)为真实海洋环境下的体积光效果.与真实效果相比,本文方法可以清晰的展现海下光照的特性.(c)为文献[3]中的体积光效果,(d)为文献[8]的实验效果图.本文方法与文献[3]对比,更加真实.文献[8]在Houdini平台下离线渲染的效果,在实时性方面,本文仿真效果更好.

图3 海下光照模拟与对比Fig.3 Comparison of underwater illuminations

图4为引入散射相位函数后不同g值下海水散射效果,与传统的雾化效果粗略表现相比,更加真实的展现海下光照的散射效果.由图4(a)到图4(d)的效果可以看出随着g值的增加,得出的散射效果与真实的海底散射较为接近.图4(d)为g=1.0时,获得较为清晰的体积光.

图4 不同g值下的散射效果对比Fig.4 Comparison of scattering effects at different values

图5 不同焦散效果对比Fig.5 Comparison of different caustics

图5为不同焦散效果的对比.图5(a)为本文方法是通过对焦散图采样映射到焦散接受体实现焦散效果的实时模拟,实时帧率达到70fps.图5(b)为文献[4]中焦散效果,但其各相散射分量的求和使其仅适用于小规模场景中焦散的表现,且实时帧率仅为12.5fps.图5(c)为真实环境下的焦散效果.与图5(c)相比能很好的模拟真实环境下的焦散效果.

图6 不同时刻体积光和阴影变化Fig.6 Volume light and shadow changes at different times

图6为不同时刻体积光和阴影的变化情况,由表1的帧速率可证明本文海下光照模型可以实时渲染不同时刻下的体积光和阴影的变化.

表1 不同渲染质量的帧速率表Table 1 Frame rate table with different rendering quality

表1为Unity3D平台下不同渲染质量随时间变化的帧速率数据.由表中帧率变化可知随着时间增加,帧速率趋于稳定,前期帧速率较低究其原因是因为我们通过前向渲染方法对场景中所有物体都要进行计算裁剪后渲染.

5 结 论

本文针对海下光照可视化过程中,海下光照难以实时绘制问题,提出一种基于光线追踪算法的海下光照的实时仿真模型.在传统的光线追踪算法基础上,通过求解亮度值积分与透光比相结合策略,有效解决水下光束绘制问题.并采用阴影贴图与纹理映射相结合的方法改善了阴影与焦散效果实时绘制的问题.并引入线性八叉树算法,加快光线与节点碰撞检测速度,使海下光照绘制帧速率稳定在67fps左右.实验表明,所提出的模型能够实现海下体积光与阴影、焦散实时绘制的逼真效果.

焦散效果绘制的过程是将计算好的光斑绘制在纹理图上,因此添加其他光源之后,不能做出实时的计算与渲染.如何在保证实时仿真的同时,又解决多光源添加之后对海下光照影响的问题,将是我们未来工作的重点.

猜你喜欢
纹理阴影光照
肉种鸡的光照不应性对养殖生产的不良影响分析
你来了,草就没有了阴影
基于BM3D的复杂纹理区域图像去噪
隐蔽的力量
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理
阴影魔怪
消除凹凸纹理有妙招!
水禽舍的光照及其控制