最近索尼跟微软都已经发布下世代游戏主机的硬件信息,随着NVDIA/AMD开始发布各自的硬件光线追踪管线,特别是微软的DXR发布,可以预见下一世代开始会有越来越多光线追踪的游戏发布。而光线追踪实际上是一个很古老的算法了,但是囿于计算成本非常高,虽然天然适合并行化,但在之前世代还是无法完全在实时场景中使用,而应用了光线追踪之后,对比原先实时渲染的各种对环境光反射的各种hack,光线追踪渲染的场景会对场景的光照质量提升明显一个档次:
可以看出来在使用了光线追踪之后,地板上更加真实的反射了场景中其他物体的光照,令整个场景显得更加真实
光线追踪算法本身并不复杂,大概原理可以用下面这张图来展示:
其算法就是,从Camera出发,发射一条光线,光线往前走,碰到物体后根据物体的材质进行光照计算出反射的颜色,然后根据物体的材质,反射出第二条光线,然后继续往前走,一直重复这个过程,直到光线到达了场景中的光源,或者直到找不到碰撞物体到达了无限远为止。而实际在应用的过程中,为了减少计算消耗,还会设置另外一个终止条件,例如反射到了若干次数之后停止迭代。而最终这条光线的颜色,就是当前光线最终的颜色了。
可以看出来,现代GPU,是天然适合并行化做这个事情的,对于OpenGL来说,我们可以在Fragment Shader中一个像素分别对应一条光线的发射,而且光线追踪算法本身各个点发射的光线本身是互不影响的,因此只要单个Shader就能完成整个光线追踪的任务。
而对于上面来说,上述只是求了一条光线的追踪路径,对于场景中的具体某个物体来说,只是求到了某次反射的结果,而场景中物体的真实光照效果,根据渲染方程,是需要求解物体表面法线方向上的半球积分内的累计光照: