APP下载

一种改进的阴影映射算法

2018-01-26曹家乐冯月萍

吉林大学学报(理学版) 2018年1期
关键词:阴影纹理静态

曹家乐, 冯月萍

(吉林大学 计算机科学与技术学院, 长春 130012)

阴影是一种常见的光照现象, 通常是指由于光沿直线传播被不透明物体阻挡而产生的黑暗区域. 阴影的渲染能显著增强虚拟现实场景的真实感[1-6].

目前已有多种阴影渲染算法, 这些算法主要分为三类, 即全局光照算法、 阴影映射算法和阴影体算法[7-11]. 其中以光线追踪为代表的全局光照算法虽然效果逼真, 但计算量巨大, 很难进行实时绘制[12-13]. 阴影映射算法和阴影体算法可视为全局光照方法的近似方法. 阴影体算法由于对场景中的物体几何复杂程度有严重的依赖, 且对场景中物体形状的构成有严格限制, 因此适用性较差. 而阴影映射算法[14]对场景复杂度几乎没有任何限制, 并且原理简单, 绘制速度快, 已逐渐成为该领域的研究热点. 研究表明, 在深度纹理中储存除深度外的更多信息可有效提升阴影渲染的质量[15], 并且通过滤波技术过滤阴影的边缘, 可得到软阴影效果[16-18]. 文献[19]改善了阴影映射算法存在的误差问题.

传统阴影映射算法在每帧中均对场景中的所有物体进行两遍绘制, 第一遍绘制计算场景中物体的深度并生成一张深度纹理, 第二遍绘制渲染场景并计算阴影. 但在一个复杂场景中, 有些物体是静止的, 静止物体的深度信息不变, 所以并不需要在每帧的第一遍绘制中都计算其深度. 基于该思想, 本文提出将传统算法中的一张深度纹理分成动态深度纹理和静态深度纹理两张深度纹理. 实时监测场景中各物体的运动状态, 动态深度纹理记录场景中运动物体的深度信息, 静态深度纹理记录静止物体的深度信息, 在算法的第一遍绘制中只需更新动态深度纹理的深度信息, 不需重新计算静态深度纹理的信息, 在算法的第二遍绘制中通过动态深度纹理和静态深度纹理共同计算阴影. 实验结果表明, 该方法相比于传统阴影映射算法, 减少了深度信息的计算, 提高了算法的运行效率.

1 传统阴影映射算法

阴影映射算法[10]是实时渲染领域最常用的阴影渲染算法, 其基本原理是以光源为视点可看到场景中所有被照亮的部分, 而光源看不到的区域则是阴影区域. 该方法主要分为两步:

1) 以光源位置为视点对整个场景进行绘制. 记录场景中每个可见像素的深度, 这些深度信息代表了某像素上距离光源最近物体与光源之间的距离. 将这些深度信息储存后构成深度纹理.

图1 传统阴影映射算法原理Fig.1 Principle of traditional shadow mapping algorithm

2) 从真实视点的角度绘制场景, 原理如图1所示. 对于绘制的每个点, 计算其距离光源的距离D2, 并将D2与第一步绘制中生成的深度贴图中相应的深度值D1进行比较, 若D2>D1, 则表示该点与光源之间还有其他物体, 该点位于阴影中; 否则, 该点不在阴影中.

用传统阴影映射算法对场景进行实时渲染, 需要在每帧中对场景进行两次绘制. 第一次绘制生成整个场景的深度纹理, 第二次绘制计算整个场景的阴影. 如果场景中某个物体是静止的, 则其深度信息保持不变, 不需要在每帧中都对该物体计算深度信息. 传统阴影映射算法的一个明显缺陷就是只使用了一种深度纹理, 对场景中的所有物体均采用相同的处理方式, 而未对不同运动状态的物体分开处理. 无论场景中的物体深度信息是否发生改变, 传统算法都需要在每帧中重新生成整个场景的深度纹理, 从而降低了算法的效率.

2 对传统阴影映射方法的改进

2.1 用动态深度纹理和静态深度纹理记录深度信息

本文提出动态深度纹理和静态深度纹理的概念. 将传统算法中的一张深度纹理分成动态深度纹理和静态深度纹理两张纹理. 动态深度纹理用于储存当前场景中处于运动状态物体的深度信息, 该纹理需要在每帧中动态生成; 静态深度纹理用于储存当前场景中处于静止状态物体的深度信息, 该纹理不需要在每帧中动态生成, 而是在某一帧中生成静态深度纹理, 然后在之后的若干帧中重复使用该深度纹理. 如图2所示的场景中, 箱子是静止的物体, 而人物模型是运动的物体, 在传统算法中, 需要用同一个深度纹理记录整个场景中的深度信息. 将深度纹理以明暗形势显示出来, 则传统算法的深度纹理如图3所示, 本文方法提出的静态深度纹理和动态深度纹理分别如图4和图5所示.

图2 虚拟场景的阴影效果Fig.2 Shadow effect of virtual scene

图3 传统算法的深度纹理Fig.3 Depth texture of traditional algorithm

图4 静态深度纹理Fig.4 Static depth texture

图5 动态深度纹理Fig.5 Dynamic depth texture

2.2 监测场景中物体的运动状态

图6 本文算法原理Fig.6 Principle of algorithm in this paper

一个复杂的虚拟现实场景中, 物体会有静止和运动两种状态, 并且有的物体会在两种运动状态中不断切换, 所以需要动态地检测场景中物体的运动状态, 并根据运动状态对物体进行分类. 本文采用的检测方法为: 记录场景中每个物体在世界坐标系中的位置, 并在每帧的渲染中检测各物体的位置. 如果某物体的位置信息发生变化, 则表示该物体处于运动状态, 否则表示该物体处于静止状态. 该方法需要实时更新场景中物体的位置信息. 通过对场景中所有物体位置的动态监测和更新, 实现对物体运动状态进行动态的分类. 如果场景中的物体未发生运动状态的变化, 则不需更新静态深度纹理, 只需计算动态深度纹理的深度信息; 如果场景中的物体发生了运动状态的变化, 则需同时更新动态深度纹理和静态深度纹理的深度信息. 其中运动状态的变化可分为两类: 如果某物体从运动状态转化为静止状态, 则将该物体的深度信息从动态深度纹理中删除, 并在静态深度纹理中添加该物体的深度信息; 如果某物体从静止状态转化为运动状态, 则将该物体的深度信息从静态深度纹理中删除, 并在动态深度纹理中添加该物体的深度信息, 此时该物体需要在每帧中重新计算深度信息.

实时检测场景中物体的运动状态会影响程序的性能. 为了减少运动状态检测对程序性能的影响, 如果虚拟场景中的某些物体运动状态始终不变, 则可根据实际情况减少需要检测的物体个数. 例如, 在某些电子游戏的城市场景中, 街道上的楼房始终是静止不动的, 则不需要在每帧中去检测其运动状态.

2.3 用两种深度纹理共同计算阴影

本文算法原理如图6所示. 计算某个像素是否处于阴影中, 需要先求出在某个像素上动态深度纹理记录的深度值D1和静态深度纹理记录的深度值D2的最小值, 记为D3, 即D3=min{D1,D2}; 再计算该像素与光源的距离, 记为D. 如果D>D3, 则该像素位于阴影中, 否则该像素不位于阴影中.

在生成深度纹理时, 对动态物体和静态物体分别生成动态深度纹理和静态深度纹理, 但在计算阴影时, 不能只对某种运动状态的物体单独使用某种深度纹理, 而要将两种深度纹理求最小值再计算阴影. 这是因为不同种运动状态的物体可能会存在相互遮挡的关系, 即某种运动状态的物体可能处于另一种运动状态物体的阴影中. 如果对静止的物体只应用静态深度纹理计算阴影, 则会导致运动物体所产生的影子无法投射到静止的物体上.

本文算法对静止物体只计算一次深度纹理, 之后重复使用, 直到物体运动状态分布发生变化; 对于运动物体, 在每帧中都计算其深度纹理. 因此, 本文算法的运算效率受场景中物体运动状态分布的影响. 处于静止状态的物体越多, 本文算法的运算效率越高, 对传统算法的优化越明显. 在极端情况下, 如果场景中物体始终处于静止状态, 则本文算法几乎省去了传统算法中的第一步操作, 极大提升了运算效率. 如果场景中所有物体都一直保持运动状态, 则本文算法很难得到效率上的优化, 而且由于检测场景运动状态对效率的影响, 该算法的运算速度甚至会略低于传统阴影映射算法. 但根据对各种虚拟现实场景的分析可知, 在绝大多数大规模虚拟现实场景中, 都会出现一定比例的静止物体, 所有物体均处于运动状态的情况很少. 本文算法的算法流程如图7所示.

图7 算法流程Fig.7 Flow chart of algorithm

3 测试实验

用OpenGL 3.3作为图形程序接口, 用Visual Studio2013作为开发工具, 在Windows7操作系统上实现本文算法. 该实验的硬件环境为Intel i3处理器, 4 GB内存, NVIDIA GeForce GT620显卡, 1 GB显存.

由于本文算法对场景中静态物体和动态物体生成不同的深度纹理, 而在一个复杂场景中物体的静止和运动状态可能会不断变化, 所以为了验证本文算法的效率, 需要模拟出运动状态不断变化的特征. 因此实验中设置了一个函数来指定场景中物体的运动和静止状态, 记为函数P. 函数P通过生成随机数指定某些物体运动, 而另一些物体静止. 每隔一段时间会调用一次该函数, 通过这种方式模拟一个不断变化的虚拟场景.

当渲染不同的虚拟场景时, 场景中物体运动状态的分布会不同. 为了检测本文算法应对各种虚拟场景的运行效率, 为函数P设置一个参数K表示场景中物体运动状态的分布.K值表示该场景中处于运动状态物体的面片数占所有物体面片数的百分数,K∈[0,1],K=0表示该场景中所有物体都是静止的,K=1表示该场景中所有物体都是运动的.

实验分为两部分. 第一部分实验中, 检测不同场景复杂度下本文算法的运行效率. 实验中设K=0.5, 通过改变场景中三角形面片数量来改变场景的复杂度, 并对每个场景分别应用传统阴影映射算法和本文改进算法, 记录每次实验的渲染帧数, 实验结果列于表1. 由表1可见, 本文算法在一个较复杂的场景中, 在运动物体和静止物体数量相近的情况下, 能显著提升场景的阴影渲染速度.

第二部分实验检测在场景复杂度相同的条件下, 场景运动状态分布不同时, 算法运行效率的变化情况. 该实验采用如图8所示的一个实际项目中的真实场景: 若干辆汽车在街道中穿行. 在实验中基于不同的K值设置运动汽车和静止汽车的数量, 然后检测场景的渲染速度. 随着K值(运动物体所占百分数)的变化, 即处于运动状态汽车数量的变化, 阴影渲染速度的变化如图9所示.

表1 当K=0.5时传统算法与改进算法的渲染速度对比

图8 3D项目中街道上的汽车场景Fig.8 Scene of cars from 3D project on street

图9 在不同K值下传统算法和改进算法的渲染速度Fig.9 Rendering speed of traditional algorithm and improved algorithm at different K values

由图9可见, 传统阴影映射算法在每帧中都为整个场景生成一张深度纹理, 所以其运行效率和K值无关. 而本文算法将运动物体和静止物体区别对待, 当K值改变时, 算法的运行效率会发生改变. 随着K值的增加, 本文算法的运行效率呈线性递减趋势. 当K值较小时, 本文算法的运行效率明显高于传统阴影映射算法. 由于本文算法需要额外检测场景中物体的运动和静止状态, 当K值增大到一定程度时, 本文算法的运行效率会略低于传统算法. 在本文实验所绘制的虚拟场景中, 当K≤0.8时, 本文算法的运行效率优于传统阴影映射算法. 研究表明, 当渲染复杂场景时, 场景中运动物体所占的百分数(K值)趋近于1属于极个别情况, 即本文算法在绝大多数情况下运行效率都优于传统算法.

综上所述, 本文提出了一种改进的阴影映射算法, 通过使用两种不同类型的深度纹理(即动态深度纹理和静态深度纹理)计算场景的阴影. 根据运动状态对场景中物体进行分类, 对运动物体和静止物体分开处理, 仅实时更新动态深度纹理, 静态深度纹理在某一帧中生成一次, 并在之后的若干帧中重复使用, 改进了传统算法中对深度信息不改变静止物体仍要实时计算深度信息的不足. 实验结果表明, 对于绝大多数复杂场景的渲染, 本文算法的渲染速度都明显优于传统阴影映射算法.

[1] 张威巍. 虚拟环境中阴影的实时绘制算法研究 [D]. 郑州: 解放军信息工程大学, 2009. (ZHANG Weiwei. Research on Real-Time Rendering Algorithms of Shading and Shadows in Virtual Environment [D]. Zhengzhou: PLA Information Engineering University, 2009.)

[2] 沈潇. 三维场景实时阴影算法的研究与实现 [D]. 重庆: 重庆大学, 2006. (SHEN Xiao. The Research and Implementation of Real-Time Shadow Algorithms in 3D Scene [D]. Chongqing: Chongqing University, 2006.)

[3] 李凌春. 面向游戏与动画应用的阴影技术研究 [D]. 上海: 上海交通大学, 2008. (LI Lingchun. Soft Shadow Rendering for 3D Games and Animations [D]. Shanghai: Shanghai Jiaotong University, 2008.)

[4] 蒋伟, 李小龙, 刘亚威. 基于有理数阶偏微分的图像增强新模型 [J]. 四川大学学报(自然科学版), 2016: 53(1): 47-53. (JIANG Wei, LI Xiaolong, LIU Yawei. Image Enhancement New Model Based on Rational-Order Partial Differential [J]. Journal of Sichuan University (Natural Science Edition), 2016: 53(1): 47-53.)

[5] 夏欣, 葛龙, 孟宏源. 基于改进CV的图像分割 [J]. 四川大学学报(自然科学版), 2017, 54(6): 1185-1189. (XIA Xin, GE Long, MENG Hongyuan. Image Segmentation Based on an Improved CV Model [J]. Journal of Sichuan University (Natural Science Edition), 2017, 54(6): 1185-1189.)

[6] 张德发, 肜丽. 多光源图像细化和细节增强的协同图像处理算法研究 [J]. 重庆邮电大学学报(自然科学版), 2014, 26(2): 260-264. (ZHANG Defa, RONG Li. Multi-light Source Image Defined and Enhanced Image Processing Algorithms [J]. Journal of Chongqing University of Posts and Telecommunications (Natural Science Edition), 2014, 26(2): 260-264.)

[7] 过洁, 徐晓旸, 潘金贵. 基于阴影图的阴影生成算法研究现状 [J]. 计算机辅助设计与图形学学报, 2010, 22(10): 580-590. (GUO Jie, XU Xiaoyang, PAN Jingui. Present Status of Shadow Generation Algorithms Based on Shadow Maps [J]. Journal of Computer—Aided Design & Computer Graphics, 2010, 22(10): 580-590.)

[8] 朱山. 基于OpenGL的实时阴影算法研究 [D]. 武汉: 华中科技大学, 2011. (ZHU Shan. The Research of Real-Time Shadow Algorithms Based on OpenGL [D]. Wuhan: Huazhong University of Science and Technology, 2011.)

[9] 刘力. 实时阴影渲染 [D]. 上海: 上海交通大学, 2008. (LIU Li. Real Time Shadow Rendering [D]. Shanghai: Shanghai Jiaotong University, 2008.)

[10] 吴跃. 基于GPU的实时阴影算法研究 [D]. 苏州: 苏州大学, 2009. (WU Yue. Research on Real-Time Shadow Algorithm Based on GPU [D]. Suzhou: Soochow University, 2009.)

[11] 周毓. 游戏中实时渲染的研究与应用 [D]. 北京: 北京交通大学, 2013. (ZHOU Yu. Research and Application of Real-Time Rendering in the Game [D]. Beijing: Beijing Jiaotong University, 2013.)

[12] Cook R L, Porter T, Carpenter L. Distributed Ray Tracing [J]. ACM SIGGRAPH Computer Graphics, 1984, 18(3): 137-145.

[13] Crow F C. Shadow Algorithms for Computer Graphics [J]. ACM SIGGRAPH Computer Graphics, 1977, 11(2): 242-248.

[14] Williams L. Casting Curved Shadows on Curved Surfaces [J]. ACM SIGGRAPH Computer Graphics, 1978, 12(3): 270-274.

[15] Peters C, Klein R. Moment Shadow Mapping [C]//19th ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games (i3D). New York: ACM, 2015: 7-14.

[16] Selgrad K, Dachsbacher C. Filtering Multi-layer Shadow Maps for Accurate Soft Shadows [J]. Computer Graphics Forum, 2015, 34(1): 205-215.

[17] Liktor G, Spassov S. Stochastic Soft Shadow Mapping [J]. Computer Graphics Forum, 2015, 34(4): 1-11.

[18] Schwärzler M, Luksch C, Scherzer D, et al. Fast Percentage Closer Soft Shadows Using Temporal Coherence[C]//Proceedings of the ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games. New York: ACM, 2013: 79-86.

[19] Lecocq P, Marvie J E, Sourimant G, et al. Sub-pixel Shadow Mapping [C]//Proceedings of the 18th Meeting of the ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games. New York: ACM, 2014: 103-110.

猜你喜欢

阴影纹理静态
最新进展!中老铁路开始静态验收
静态随机存储器在轨自检算法
你来了,草就没有了阴影
基于BM3D的复杂纹理区域图像去噪
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理
阴影魔怪
消除凹凸纹理有妙招!
油罐车静态侧倾稳定角的多体仿真计算