发布与我的专栏:
miccall:当我们在说"渲染"的时候,我们在说什么? -- 从渲染到渲染方程,图形学的一路假设我们在一个空的三维空间中,创建了三个点
我们知道,要确定一个面,至少得有三个点,而一个物体的构成,就是一个个的面,在图形学中,我们一般用三角面代替
这是在我们假象的三维空间中,但是我们要在二维的显示器中看到他,我们就称之为把三角形从三维空间渲染到二维空间中 。
在现实世界中,三角形会将光线向各个方向散射。但是对于一台电脑,根本不可能去计算所有不同方向的光线
所以,我们计算机渲染图像,仅仅计算了那些散射到我们人眼方向得光线 , CG里面也叫摄像机方向 ,图形学中称之为 视角方向 。
所以让我们在 3D 空间中添加一个摄像头 ,并在前面透视点让我们放置一个屏幕网格,其中每个框是我们渲染图像的一个像素。
现在,我们只画出与我们相机的透视点相交的一条光线。 如果这些光线相交于我们的屏幕,那么屏幕就能知道我们观察这个三角形的边界
我们将标出这个三角形的边框:
我们知道边界之后,在边界与像素之间重叠得部分渲染像素,其余地方不做处理,我们就得到了这个三角形的图像:
这种投影到像素格子的方法就是是计算机图形学中的光栅化渲染方法。
这是七十年代的图形科学家所研究的内容,并且至今仍然是GPU渲染管线的一部分
除了光栅化,还有另一种方法 - ray casting :
让我们回到我们的3D对象空间,但这次我们将添加第二个三角形:
光栅化是以物体为中心的,这意味着我们从相机捕捉 物体所发射到相机的光线,而
Ray casting 以图像为中心 ,也就是说,如果我们只考虑那些实际有用的光线
(进入相机的光线) - 那为什么不把这些光线从相机发射到场景中去呢 ?
所以这一次,我们将从我们的虚拟相机开始,并通过相机向每一个像素都发射一条光线:
现在我们将判断每条射线是否射中了我们的每一个三角形 ,如果一个光线遇到多个物体 - 我们会取最近的那个点。
这个过程解决了困扰光栅化技术的一个重要问题,那就时可见性问题,如果是光栅化,那时候还不知道怎么解决远近遮挡问题 。但是后来,光栅化的解决方案是一种称为Z缓冲器的技术 , 它创建了一个深度图,然后根据该深度图检查了所有内容。但是Ray casting就不用这么麻烦。
但是他也有很大的弊端,就是计算量实在是太大了,因为他要判断相当多的射线与物体的三角面是否相交 ,假设我们有一个1000 x 1000 像素的图像,那么我们就要计算 1,000,000 条光线来检查是否和场景中一个多边形相交,对计算机来说,这计算也是相当的费劲,即使现在在算法上有了很大的改进,但仍然需要进行大量计算。
由于这个原因,在20世纪70年代的大部分时间里,光线投射并没有被广泛的研究
但是光栅化有三个问题一直没有人能够很好地解决:那就是如何模拟真正的阴影,反射和折射。
后来,解决办法还是回到Ray Casting ,并在这项旧技术上添加新的变化。
1980年,在贝尔实验室工作的一位名叫Turner Whitted 的工程师在 SIGGRAPH 发表了一篇论文,题为“An Improved illumination Model for Shaded Display”,一手解决了阴影,反射和折射问题。
Whitted的技术称为递归的 射线追踪 Ray tracing 。
我们还是从相机的射线开始像之前一样。
这些被称为主光线。但是,当主光线接触一个表面,Whitted的方法是画出反射射线。
为了解决阴影问题,我们通过在反射方向上绘制二次光线来绘制阴影光线,只要这个光线可以反射到光源,那么我们就知道是光源照亮的这个物体。
如果我们发现光与表面之间存在物体,这时,表面就处于阴影中 。
当光线遇到表面反射,我们使用入射角绘制反射光线,以不断反射下去,看看这条反射光线在哪里。
如此不断的反射,所以被称之为 ,递归射线追踪。
如果对象是透明的,则需要类似的过程。但是使用角就变成使用折射率来确定新的折射光线的角度:
最终光线追踪得到的效果就是 :
所以,正如你所看到的那样,让Ray Casting 更好的解决方案就是 绘制和分析 更多的光线。
这是Turner Whitted 1980年在他的论文中第一张光线追踪图像之一 , 在这张图片中,明显的阴影,反射和折射效果。这512x512渲染图花了74 分钟。
不像光栅化,递归光线追踪 实际上是模拟真实光线在物体周围反射时的真实行为,但是对真实的表现,还是远远不够的,后来又有大量的人们开始进入该领域深入研究,并在计算机科学中,投入大量的时间尽力,开始研究光线追踪算法 ,以此来真正模拟光的规律。
即使光线追踪产生非常逼真的阴影,反射和折射,像运动模糊和景深场这样的问题可以相对容易地解决,但是最多具有极复杂的光线模拟:
其中,最重要的应该是间接照明 , 相对直接照明是指光直接照射并被物体反射。但在真实世界的光线不仅来自光源
间接光被用于全局光照
直接光与间接光
1986年,James Kajiya 发表了一篇名为“rendering equation”的论文。于是世界就不一样了。这个方程我们稍后再讲,
James Kajiya
它基于Conservation of energy【能量守恒】和 麦克斯韦方程,来正确地模拟应该被感知的光线 。
辐射率大小对环境光的影响
同样,渲染方程最难的一点也是计算 。
所以在发展过程中,游戏渲染采用了许多策略来尝试找到计算的捷径。
最早的是尝试从许多不同的方面呈现基本光线追踪图像的光能传递角度和求取他平均值。
后来 , 又出现了蒙特卡罗积分,这是基于概率的一种近似方式,可以通过求平均来求解积分,这个方法运用了大量的随机值 。来对光线进行采样和优化 。
后来运用到渲染方程已经是十年后了,皮克斯的第一部全长CGI电影:玩具总动员于1995年问世 :
此后的日子里,人们就像这样,仿佛找到了研究的方向,不断的寻求积分的最优解,有快解。
于是,不断的追求速度与精度,就成了图形学发展的最重要的方向 。 |