- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于Flash聚光灯光照算法
基于Flash聚光灯光照算法
摘要 本文提出一种基于网页的动态场景中体积光照的计算方法。该方法对已有体积光采样方式进行改进,通过极坐标采样模拟聚光灯的体积光照效果。算法在当前主流GPU上运行时,能够满足实时渲染的要求。
关键词 体积光照;实时渲染;聚光灯
中图分类号TP39 文献标识码A 文章编号 1674-6708(2012)80-0222-02
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 渲染物体表面反射
对于每个像素,本文采用的简化的光照模型进行渲染,只考虑至物体的环境光与漫反射效果:
(1)
先根据存储的颜色信息计算出环境光照效,为环境光参数:
(2)
再根据深度纹理还原出顶点的位置信息,根据光源位置,计算光源与物体之间的距离,除以光照距离得到光衰减att:
(3)
通过光照向量和纹理恢复出的法向量,计算出光照与物体表面的夹角,引入光源颜色,以及漫反射纹理对应的颜色,得出漫反射光照效果:
(4)
为了模拟聚光灯边缘的光照减弱效果,引入参数fall:
(5)
其中a为光减弱起始角,b为最大光照角度,为光照向量与聚光灯正对方向夹角
最后根据公式(1)进行叠加,产生物体表面的直接光照效果。
1.4 渲染体积光照效果
在渲染完表面直接光照的基础上,通过设置多个采样面,对各采样面的像素进行混合叠加来模拟均匀空间下的单次散射体积光照效果。对于聚光灯, 由于采用平行平面采样会导致在光源点附近光照效果的不平滑,此算法没有根据深度来设置平面,而是根据光照的夹角来设置采样平面。
算法根据可手动设置的采样率,将聚光灯的视锥按照相同夹角间隔等分出采样面,对于每个采样面像素根据以下公式计算:
(6)
在计算像素时,需要先判断采样点的深度值是否小于第一阶段深度纹理所存信息,采样点深度值大于深度纹理保存值,像素值取零,保证视线被物体遮挡的部分不会进行叠加。
通过对采样平面中的采样值与采样面之间间距及采样点到视点光衰减率的乘积进行累加渲染,即可得到最终的体积光照效果。
2 算法效果分析
本文所进行的试验均在Nvidia GT 240的环境下进行测试,屏幕分辨率为1024*768:
左图为根据深度来设置采样面,右图根据光照角来设置采样面。两种方式的采样率均为16次采样,渲染帧数能达到24帧以上。从图中可以明显看出,在相同采样率的情况下,通过平行平面采样在光源点附近会由于采样率不足导致光照效果的不平滑,根据光照角度设置采样面就能避免这一现象,在光源点附近产生具有高度真实感的效果。
文档评论(0)