分类:成语大全时间:2022-11-11 01:56作者:未知编辑:猜谜语
发布与我的专栏:
miccall:当我们在说"渲染"的时候,我们在说什么? -- 从渲染到渲染方程,图形学的一路416 赞同 · 18 评论文章假设我们在一个空的三维空间中,创建了三个点
我们知道,要确定一个面,至少得有三个点,而一个物体的构成,就是一个个的面,在图形学中,我们一般用三角面代替
这是在我们假象的三维空间中,但是我们要在二维的显示器中看到他,我们就称之为把三角形从三维空间渲染到二维空间中 。
在现实世界中,三角形会将光芒向各个方向散射。但是对于一台电脑,根本不可能去计算所有不同方向的光芒
所以,我们计算机渲染图像,仅仅计算了那些散射到我们人眼方向得光芒 , 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年问世 :
此后的日子里,人们就像这样,仿佛找到了研究的方向,不断的寻求积分的***优解,有快解。
于是,不断的追求速度与精度,就成了图形学发展的***重要的方向 。