【前言】
CORONA渲染器使用路径追踪来渲染图像。什么是路径追踪呢?路径追踪是一种渲染算法,它通过跟踪来自摄像机的独立光路来计算最终图像。
本来我想洋洋洒洒写一篇通俗易懂的文章,后来,我在网上看到了一位从事动画电影特效工作的网友,他写的一篇关于路径追踪文章,内容非常好。我感觉那就是我想写的文章,这使我无法动笔了。所以,特意去掉的C++语言部分,部分转载给大家。
【转载】
转载地址:http://ymuhua.com
光线追踪的渲染技术已经被大量运用到现在的电影产业中,我们身边也出现了大量光线追踪的渲染器,Arnorld,Vray,Houdini的mantra,Maxwell、Corona等等。它出现的目的也是为了追求更真实的物理效果。
光线追踪技术的光线是摄像机发出的,最后追踪到光源结束。光线追踪算法中,一个物体要被观察者(camera)看到要具备两个因素。其一,就是要有光,物体不被光照到我们是看不到,其二,就是当然要有物体,光被物体反射入观察者眼中才能被看到。所以,光线追踪算法就是计算光线和物体交互,碰撞检测的算法。
光线追踪算法分为两种:正向追踪算法和反向追踪算法。其中,正向追踪算法是大自然的光线追踪方式,即由光源发出的光经环境景物间的多次反射、透射后投射到景物表面,最终进入人眼。
反向追踪算法正好相反,它是从观察者的角度出发,只追踪那些观察者所能看见的表面投射光。就目前而言,所有3D制作软件的光线追踪算法都是采用反向追踪法,原因是这种算法能够最大程度地节省计算机的系统资源,而且不会导致渲染质量的下降。
为什么反向追踪快呢?我们玩走迷宫,是正走快,还是反走快?
反向追踪法就是从观察者开始向场景中射出光线,当光射出后打到物体上后,我们再从那个被击中的点所在表面在射出光线(我们假设称作阴影光线或光源光线)。如果这光源光线被射出后遇到了场景中的光源。那么我们就能看到这个物体,又或者这光源光线又打到了另外一个物体上 ,那么我们看到的这个物体就在阴影中。
接下来我们来介绍栅格化(Rasterization)。就是将图转化为一个个栅格组成的图象
为什么要栅格化,因为我们知道我们的电脑屏幕是由像素点组成。目前主流的像素已经1920*1080。也就是说,我们的屏幕横向有1920个像素,然后丛向有1080个像素点。
我们在渲染设置中,设置图像大小就是这个。所以,我们要将三维的模型投射到屏幕上面,然后将每个像素点填充上一个相对硬的颜色,就好比一个圆是由多个网格组成。当然了,网格细分越高,显示精度也越好。
光线追踪的灵魂所在就在于光线。所以,我们基于屏幕的每个像素点射出去一个光线。如果射出去的光线碰到了障碍物(模型),我们就能将这个像素点填充上相应障碍物的信息(根据灯光,物体材质)。如果什么都没碰到,那么相对因的像素就什么都不显示(背景颜色)。
现在我们知道了,每个像素到底看到了什么。然后我们通过重复的遍历屏幕上的每个点,那么一个球就出现在屏幕上了。是不是很好理解?
好了,下面我用为代码来简单介绍一下一个简单的渲染器的工作流程。省略........
影响一个像素点颜色由三个通道来表示,R(红),G(绿),B(蓝)也就是这三个通道来表示,我们知道通过这三个颜色组合,我们可以得到所有的颜色。比如红色+蓝色=紫色。
我们现在定义每个颜色通道为8位,也就是2^8。他表示范围为0-255。0表示最小值,255表示最大值。所以
黑色:0,0,0
红色:255,0,0
绿色:0,255,0
蓝色:0,0,255
白色:255,255,255
那么问题来了,如何来决定某个像素的值呢:
它由多个因素来决定的。请看下图:
我们简单来分析: 首先一束光射出去,我们打到一个物体上,
如果打到一个物体向光面上,那么我们会根据物体的材质(物体本体颜色,对光的漫反射,对其他物体的反射)来计算像素点材质。
如果打到一个背光面上,那么这就是阴影。
如果什么都没打到那么,那么他就是个背景颜色。
毕竟在光线追踪影响物体颜色的因素太多了,因为光线是在空间中不停的反弹。有直接反射,间接反射,理论上来说如果计算时间足够长,那么得到的结果就无限接近真实效果,但是时间和效果往往是矛盾的,我们如何在有限的时间中得到尽量真实的效果就是我们之后要做的。
【后记】
看完这篇图文并茂的文章,你是否明白CORONA渲染器的光线追踪是怎么回事了吧?再次感谢作者的好文章。喜欢的朋友可以到该作者的网站上去看他更多的文章。
网友评论