当别人在讨论光追比传统光栅化牛逼在哪,你不懂点原理好意思说自己是游戏开发的吗!!
计算机图形学中最基本的要解决的问题之一,就是要将三维空间中的物品,在设定好相机角度后,渲染为一张二维屏幕上的画面。很久以来我都对着一点很疑惑:平时在Unity搭建场景的时候看到的不就已经是三维场景的二维画面了吗?为什么还要考虑这个渲染的问题……那tm是因为Unity已经完成了实时渲染这一步伞兵……过去长久的历史中,人们对这个问题的解决办法,就是考虑三维空间中的每一个物件(object),看它对屏幕上的每个像素会造成什么影响(contributes),这样的办法称为object-order rendering,也是面试官常问的渲染管线中所使用的渲染方法。但光追,完全是另一个思维。
Ray Tracing的基本定义
光追使用的渲染方法又称为image-order rendering,即从每个像素出发,考虑所有能对这个像素照成影响的光线。
这里可以插一嘴便于理解光追和光栅化的区别:光栅化是对光照的一种近似,科学家们用各种手段,让光照后的画面看着像现实中的画面;但光追是真正的让光,从现实世界,投射进了你眼前的这块屏幕,你所见的,与现实世界中并没有分别。
虎书之所以先介绍光追而不是传统的光栅化,是因为学习光追可以省去object-order rendering中的mathematical machinery??真的吗?我不信……
光追的思想是:从像素中“发射”出一道光线(光线的角度我猜测与摄像机和像素位置之间的关系得出),关注与这条光线相交的所有objects中,与摄像机最近的一个,因为这个物体是唯一得到这条光线直接光照的物体。因此光追的步骤可以分成如下三步:
程序的伪代码也就对应地得到:
透视