简介
这是一套关于如何使用cuda实现path tracing算法的系列教程。
背景
我是一名计算机学院的研究生,目前就读于浙江大学。由于自己非常热爱图形学,因此会花很多时间学习图形学的相关知识,包括opengl、dx这些图形API,还有unity、unreal等游戏引擎。
最近几个月一直在研究path tracing算法。当第一次看到path tracing跑出来的渲染图时,我整个人都惊呆了:全局光照的光影效果实在是太棒了!但是path tracing也有一个致命缺点:计算量太大。往往渲染一张图片需要花上几分钟甚至几十分钟的时间。好在path tracing拥有天生的高度并行性,使得它可以被完美地移植到GPU上运行,而且可以大大提高渲染速度。cuda作为Nvidia的通用并行计算架构,提供了强大的计算能力,是目前做GPU通用计算的不二首选。所以path tracing和cuda是一对再好不过的搭档,正好可以互相成全。
目的
感谢前辈们的努力,path tracing已经被研究地很透彻了,而且还延伸出各种变型:photon mapping, bidirectional path tracing, metropolis light transport...关于path tracing的并行化,也已经有了长足的进展。像Brigade这种号称是real-time path tracing的游戏引擎都面世好几年了,其内部肯定用了GPU并行加速。
在研究path tracing的过程中,我参考了大量国外技术博客,也翻阅了一些国外课程网站和期刊论文。但是无一例外,所有参考资料都来自国外。由此可以看出国内对图形学的研究较之国外,还差很多,至少经典的图形学算法的普及度还不够(浙大CAD实验室还是有很多图形学牛人的,比如周昆大神0 0)。因此我想把我这段时间的所思所想所学都写下来,放在网上。一方面想系统地捋一遍最近学到的知识,另一方面也想尽自己的一份绵薄之力,写一套比较系统的技术教程。希望这些文章能对感兴趣的同学有所帮助。
安排
关于cuda部分,我会介绍cuda的基本理论和编程方法。其实对于我们要实现的cuda path tracer来说,我们并不需要深入了解cuda的技术细节,入门即可。
关于path tracing部分,我准备从最基本的数学理论一步步讲起。其中monte carlo方法是重点要讲的部分,此外还有rendering equation。
说一句题外话。我个人认为,像path tracing这类的全局光照算法是非常优雅的算法,因为它的模型本身就是对现实场景的很好模拟,比如光线的反射、折射、散射,比如光线在场景中的传输;而像传统的栅格化算法相比前者就显得丑陋不堪,因为它是局部光照算法,模型本身就没有考虑物体之间的相互影响。所有全局光照才有的效果,例如阴影、焦散、color bleeding,只能通过各种hack的方法实现。所以学习计算机图形学最好是从全局光照算法开始,而现在大部分高校的计算机图形学课程都是先讲或者只讲opengl的。
感谢
我目前实现的cuda path tracer,其中大部分的技术细节都来自Sam Lapere的博客。除此之外还参考了RichieSam's blog, CAPISCE's blog, smallPT, Peter Kutz and Yining Karl Li's homework...另外还要重点提一下scratchapixel,如果你和我一样只是刚入门没多久,又想认真学习计算图形学的理论知识的话,强烈推荐这个网站!scratchapixel的技术门槛比较低,而基础理论讲得非常详细,通俗易懂。个人尤其喜欢它关于monte carlo的讲解,终于解答困扰了我多年的疑惑!缺点就是更新速度太慢,但是放出来的教程已经基本涵盖了path tracing的所有理论基础了。