57 个回答
发布与我的专栏:
假设我们在一个空的三维空间中,创建了三个点
我们知道,要确定一个面,至少得有三个点,而一个物体的构成,就是一个个的面,在图形学中,我们一般用三角面代替
这是在我们假象的三维空间中,但是我们要在二维的显示器中看到他,我们就称之为把三角形从三维空间渲染到二维空间中 。
在现实世界中,三角形会将光线向各个方向散射。但是对于一台电脑,根本不可能去计算所有不同方向的光线
所以,我们计算机渲染图像,仅仅计算了那些散射到我们人眼方向得光线 , 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”的论文。于是世界就不一样了。这个方程我们稍后再讲,
它基于Conservation of energy【能量守恒】和 麦克斯韦方程,来正确地模拟应该被感知的光线 。
同样,渲染方程最难的一点也是计算 。
所以在发展过程中,游戏渲染采用了许多策略来尝试找到计算的捷径。
最早的是尝试从许多不同的方面呈现基本光线追踪图像的光能传递角度和求取他平均值。
后来 , 又出现了蒙特卡罗积分,这是基于概率的一种近似方式,可以通过求平均来求解积分,这个方法运用了大量的随机值 。来对光线进行采样和优化 。
后来运用到渲染方程已经是十年后了,皮克斯的第一部全长CGI电影:玩具总动员于1995年问世 :
此后的日子里,人们就像这样,仿佛找到了研究的方向,不断的寻求积分的最优解,有快解。
于是,不断的追求速度与精度,就成了图形学发展的最重要的方向 。
我提供一个给妹子解释的思路:
渲染和化妆是一样一样的 。
为什么这么说呢?我们来看这样一个图:
给它随便上点儿什么粉:
嗯,简单打个光:
补点水,磨个皮:
涂点阴影粉底,让五官更立体:
最后搞点滤镜,配个炫彩的标题,发个朋友圈:
其实我非常想把这里面每一个环节和化妆联系起来,但是我压根儿不懂妆是怎么画的。有妹子就说了: 你这里面几张图看起来也差不多啊,折腾半天也看不出来效果,有啥用?
呵呵,你买几百几千的化妆品涂脸上都是有用的嘛?怎么不见你少买?
简单地说:美术负责提供 素颜(模型) 和 化妆工具(贴图等) ;渲染工程师负责给素颜 化妆 。
当然,如果你是一个游戏爱好者,想看一个比较正经的渲染流程,去学习更多知识的话,我建议你去看 这篇关于GTA V渲染技术的科普文章 。
之前看到一篇技术sides里面说,理想的美术和渲染工程师的协作模式是:
“You make pretty art. I'll make it fit.”
但我觉得通常的情形是:
“You make ugly art. And I'll make you take the blame.”
所以就好像关于颜值这个问题有两派论点,一派认为清水出芙蓉,天然去雕饰,一个人好不好看关键还是看底子;另一派认为没有丑女人,只有懒女人,丑都是因为不会化妆。关于一个游戏画面好不好看,当然也就有两派的说法,不过 对于渲染工程师来说,游戏画面好不好看的原因,是薛定谔的 。
比如你要是看到过这个DEMO:
这些:
然后说:“哇,这个渲染效果好好啊,简直快要到电影水准了!”
我会表面上毫无波澜地跟你说:“ 是啊,国内渲染水平不但不比国外差,还有望赶英超美,你看,这就是我做的。 ”
但是你要是跟我说:“《逆水寒》上GTX 1080TI还卡的要命,画面还不如早几年出的《天涯明月刀》,你怎么说?”
呵呵,我不是项目组的,具体情况我也不知道, 可能是。。。鹅厂的美术比较牛逼吧?