基于Flash的聚光灯光照算法
2012-10-15徐训嘉
徐训嘉
同济大学软件学院,上海 201804
0 引言
提高场景的光照效果是提升虚拟场景真实感的有效途径,人们能够看到物体是因为物体的表面反射了从各种光源发出的光,最常见的有三种光源:方向光,点光源,聚光灯。方向光是由无穷远处射出的平行光线,常用于阳光效果的模拟,点光源可以看作由空间中一个特定位置的点发出各个方向的光线,聚光灯则是空间中一个特定位置的点发出的特定方向光线的光源,是本文研究的主要范围。另一方面,除了物体的表面反射,光线穿越空气等介质时还会产生散射,光在空气中的散射会使光束所穿越空间发亮,在整体环境较暗时,这种现象更加明显,例如阳光穿越云层或者树林等时产生的多个光束的效果,体积光照就是在虚拟空间中模拟上述效果。此类效果在虚拟环境中的应用能够使光照更加具有立体感,有效的提升虚拟场景的真实感。
本文通过渲染聚光灯体积光照效果,利用GPU加速,实现和改进了已有的光照算法, 使其更好地在Web3D中运行。
1 算法
1.1 算法流程
为了能有效的在场景多个光源情况下进行渲染,本文采用了基于以下的流程,将渲染场景几何信息和渲染光照效果分段进行。
渲染的每个阶段都通过vertex shader和pixel shader 利用显卡的可编程渲染管线进行计算,通过控制渲染到纹理和渲染到后台缓存来进行不同阶段间所需资源信息的传递。通过第一个阶段将场景几何信息保存在纹理中,后续阶段再根据纹理中的数据对光照进行渲染。
1.2 保存场景几何信息
渲染的第一个阶段需要使用渲染到纹理技术,从摄像机的角度,将整个场景的几何信息像素化保存在纹理中,给接下来的渲染提供必要的信息。只有这个阶段会用到3D场景中物体的信息,因此需要将物体的表面位置信息,表面法向量信息,表面颜色信息保存下来。
漫反射颜色信息直接通过3*8bits来存储RGB值,法向量信息通过对单位法向量进行线性处理,将其XYZ分量对应至0至1区间后用进行3*8bits存储,由于直接存储顶点的XYZ位置信息可能会产生精度不足的问题,这里通过转换,使用24bits存储顶点的视空间深度信息,范围在0至1区间,在后续渲染阶段,再根据摄像机的参数对深度信息进行还原,得到原有的位置信息。
1.3 渲染物体表面反射
对于每个像素,本文采用的简化的光照模型进行渲染,只考虑至物体的环境光与漫反射效果:
为了模拟聚光灯边缘的光照减弱效果,引入参数fall:
最后根据公式(1)进行叠加,产生物体表面的直接光照效果。
1.4 渲染体积光照效果
在渲染完表面直接光照的基础上,通过设置多个采样面,对各采样面的像素进行混合叠加来模拟均匀空间下的单次散射体积光照效果。对于聚光灯, 由于采用平行平面采样会导致在光源点附近光照效果的不平滑,此算法没有根据深度来设置平面,而是根据光照的夹角来设置采样平面。
算法根据可手动设置的采样率,将聚光灯的视锥按照相同夹角间隔等分出采样面,对于每个采样面像素根据以下公式计算:
在计算像素时,需要先判断采样点的深度值是否小于第一阶段深度纹理所存信息,采样点深度值大于深度纹理保存值,像素值取零,保证视线被物体遮挡的部分不会进行叠加。
本文所进行的试验均在Nvidia GT 240的环境下进行测试,屏幕分辨率为1024*768:
2 算法效果分析
图1 算法改进结果
左图为根据深度来设置采样面,右图根据光照角来设置采样面。两种方式的采样率均为16次采样,渲染帧数能达到24帧以上。从图中可以明显看出,在相同采样率的情况下,通过平行平面采样在光源点附近会由于采样率不足导致光照效果的不平滑,根据光照角度设置采样面就能避免这一现象,在光源点附近产生具有高度真实感的效果。
3 结论
本文提出了一种基于极坐标采样的聚光灯体积光照的计算方法,适用于复杂和动态的环境,在光源数量较多时也能达到具有真实感的实时渲染效果。为了能渲染大量光照,出于性能方面的考虑,没有引入阴影的机制,因此在某些情况下会造成失真的现象。在以后的工作中,使用一些轻量阴影技术避免此类现象的出现,并继续优化算法的瓶颈,将是研究的重点。
[1]Dobashi Y,Nishita T,Yamamoto T.Interactive rendering of atmospheric scattering effects using graphics hardware[J].Proc of the Graphics Hardware.2002.
[2]Baran,Chen,Ragan Kelley,Durand,Lehtinen.A hierarchical volumetric shadow algorithm for single scattering[J].ACM Transactions on Graphics 29,2010.