基于OpenGL的快速多光源渲染
摘 要:随着科技的进步,3D实时渲染越来越走近每一个人,而人们对于该项技术的运用也随之增加,除了电子游戏以外,3D实时渲染技术普遍应用于医疗、工业、科研等领域。近年来兴起的3D打印和虚拟现实更是把3D实时渲染作为基石而快速成长。3D实时渲染技术一直以来存在几个重大难题,快速处理大量法光源就是其中之一。现实中,因为有光,人们才能观察到这个世界。在3D实时渲染中,虽然不一定需要有光,但是模拟出光的效果对于增加真实性至关重要,本文提出一种全新的渲染方法,在可接受的渲染开销范围内,实现快速多光源渲染,并且不会对半透明和反走样有任何限制。通过低分辨率软光栅化为屏幕每一个区块单独计算光源列表,把光源限制在屏幕可见区域内,来剔除绝大多数不必要的计算。这种方法不会对传统的向前光照有任何影响,仅仅在像素着色阶段添加额外的光源列表,具有兼容性好、开发便利、容易模块化等优点。
关键词:OpenGL实时渲染;3D;
中图分类号:TN-9 文献标识码:A 文章编号:1674-3520(2014)-03-000267-01
一、为什么传统向前光照不能处理多光源
在讲述快速多光源渲染之前,首先需要说明一下传统的向前光照的基本流程。首先,3D物体通过顶点着色器,变换到投射空间,经过GPU硬件光栅化之后,在像素着色器里,通过被插值过的3D物体的法线与光照相关信息,进行光照计算[1]。以前可能在顶点着色器里计算光照比较多,不过无论如何,光照信息一般都是通过uniform变量传给着色器,无论顶点还是像素,着色器每次获取到的数据都是相同的,如果要进行多光源处理,需要把所有光源信息都一起传进来。对于光源来说,不可能所有光源都会在投射空间占据所有像素点,绝大多数光源可能仅仅占用不到5%,为了5%而在所有的像素内计算光照显然并不明智。由于GPU的特殊构造,分歧计算开销很大,无论是在着色器内判断每个光源是否占用当前像素,还是不判断直接进行光照计算,都是非常巨大的开销,也许十几个光源的开销还能接受,但是几百个光源显然是不可能接受了。
二、快速多光源渲染的基本流程
第一步,通过与屏幕比例相同的超低分辨率软光栅化,为每一个软光栅化像素生成一个独立的光源数据列表。第二步,把所有像素的光源数据列表合并为一个总列表,同时记录下每个软光栅化像素列表数据在总列表内的开始位置,以及当前像素列表内的光源数量。第三步,把每个像素在总列表内的开始位置与光源数量,按照像素在GPU内的分布,组成一个双通道纹理,一个通道是像素在总列表内的开始位置,另一个通道是光源数量。第四步,把第二步得到的总列表和第三步得到的纹理,传给显存。第五步,在渲染3D物体的像素着色器内,根据当前像素在屏幕上的坐标,从第三步的纹理中,采样出对应的像素值,接下来就是,逐个获取总列表中的光源数据,然后计算光照结果。下图为实际效果:
三、为什么要软光栅化与软光栅化步骤详细
现代GPU最初的目的,就是为了把光栅化从CPU手中接过来,以并行计算替代串行计算,从而实现至少3个数量级的提速[2] 。但是付出了代价,GPU的并行计算导致每个象素之间没有办法进行任何直接数据交流,每个象素的计算结果的大小必须是完全相同的。在快速多光源渲染的第一步,每个象素都是一个列表,而且每个象素的列表大小一般都是不同的,如果相同,某个象素列表里很可能会储存超过200个光源数据,所有的列表就都要超过200,否则就要丢失光源,这会导致总列表尺寸暴增,显然不可行。因此光源列表,就必须由CPU进行串行处理,也就是软光栅化。虽然软光栅化效率非常低,但是光源列表的分辨率并不需要与实际渲染窗口的分辨率相同,通常是四十分之一,例如1280X720分辨率的渲染窗口,光源列表分辨率可以只有32*18,总共576个象素。对于现代CPU来说,这样低分辨率的软光栅化当然不会很慢。快速多光源渲染的软光栅化目的不是绘制图形,而是生成光源列表,光源除了太阳光之外,都可以抽象为点光源,也就是一个球体,因此并不需要实现完整的标准软光栅化计算过程。光源列表不需要处理深度、半透明、颜色、模板,因此相关计算一律都可以省略,唯一需要的,就是把覆盖到当前像素的光源信息,添加到当前像素的列表里。
四、快速多光源渲染的硬件需求、适用范围和缺陷
快速多光源渲染最低需要显卡支持Opengl2.0,并且支持动态分支,相当于DirectX9.0c,如果可能,建议在支持Opengl3.0也就是DirectX10的显卡上实现,Opengl3.0可以用Texture Buffer Objects,在着色器获取光源数据的时候,可以大幅提高效率。快速多光源渲染最适合小尺寸场景,而且比较分散的场合,比如室内。如果一个场景内,上百个光源出现在摄像机附近,并且都覆盖了整个摄像机范围,这时候,相当于每个列表中都存了相同的数据,快速多光源渲染在这时候就无法起到任何作用了,这是最大的缺陷,因此,一定要避免此现象出现,其实此时跟GPU像素填充率不足的情况非常近似,也可以用近似的方法来处理。
参考文献:
[1]OpenGL体系结构审核委员会/Dave Shreiner/Mason Woo等 编着,OpenGL编程指南(第四版),人民邮电出版社,2005
[2]詹鹏;面向移动设备的3D图形光栅化处理单元的设计与实现[D];西安科技大学;2012年
期刊库(http://www.zgqkk.com),是一个专门从事期刊推广、投稿辅导的网站。
本站提供如何投稿辅导,寻求投稿辅导合作,快速投稿辅导,投稿辅导格式指导等解决方案:省级投稿辅导/国家级投稿辅导/核心期刊投稿辅导//职称投稿辅导。
【免责声明】本文仅代表作者本人观点,与投稿辅导_期刊发表_中国期刊库专业期刊网站无关。投稿辅导_期刊发表_中国期刊库专业期刊网站站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。
投稿辅导服务咨询与期刊合作加盟
陆老师联系QQ:
蒋老师联系QQ:
刘老师联系QQ:
联系电话:18015016272
17327192284
投稿辅导投稿邮箱:zgqkk365@126.com
期刊推荐
- 《课程教育研究》 旬刊 国家级
- 《网络空间安全》(信息安全与技术)月刊 国
- 《价值工程》旬刊 国家级 科技统计源期刊
- 《高教论坛》 月刊 省级
- 《法制与社会》旬刊 省级
- 《中国教育学刊》月刊 14版北大核心
- 《语文建设》 旬刊 14版北大核心
- 《中国绿色画报》 月刊 国家级
- 《社科纵横》季刊 社科类优秀期刊
- 《求索》月刊 14版北大核心期刊
- 《财会月刊》旬刊 14版北大核心
- 《艺术品鉴》 月刊 省级
- 《中华建设》月刊 国家级 建设类优秀期刊
- 《教学与管理》旬刊 北大核心
- 《当代经济》 旬刊 省级
- 《新课程研究》旬刊 省级 教育类优秀学术期
- 《文教资料》 旬刊 省级
- 《学术界》 月刊 双核心
- 《吉林教育》旬刊 省级 教育类学术期刊
- 《中国农业资源与区划》 月刊 14版北大核心
- 《继续教育研究》月刊 北大核心期刊
- 《财经界(学术版)》半月刊 国家级
- 《电影评介》半月刊 14版北大核心
- 《公路交通科技》 月刊 北大核心
- 《新闻传播》月刊 省级 新闻类优秀期刊