渲染(英语:render,或称为绘制)在电脑绘图中,是指以软件由模型生成图像的过程。模型是用语言或者数据结构进行严格定义的三维物体或虚拟场景的描述,它包括几何、视点、纹理、照明和阴影等信息。图像是数字图像或者位图图像。渲染用于描述:计算视频编辑软件中的效果,以生成最终视频的输出过程。
渲染是三维计算机图形学中的最重要的研究课题之一,并且在实践领域它与其它技术密切相关。在图形流水线中,渲染是最后一项重要步骤,通过它得到模型与动画最终显示效果。自从二十世纪七十年代以来,随着计算机图形的不断复杂化,渲染也成为一项越来越重要的技术。
渲染的应用领域包含:计算机与视频游戏、模拟、电影或者电视特效以及可视化设计,每一种应用都是特性与技术的综合考虑。作为产品来看,现在已经有各种不同的渲染工具产品,有些集成到更大的建模或者动画包中,有些是独立产品,有些是开放源代码的产品。从内部来看,渲染工具都是根据各种学科理论,经过仔细设计的程序,其中有:光学、视觉感知、数学以及软件开发。
三维计算机图形的预渲染( 或 )或者实时渲染( 或 )的速度都非常慢。预渲染的计算强度很大,需要大量的服务器运算完成,通常被用于电影制作;实时渲染经常用于三维视频游戏,通常透过图形处理器()完成这个过程。
图像初步创建(通常使用网格骨架构建,建模(3D modeling))之后,就要进行渲染了。渲染将会在上面添加位图纹理或者程序纹理、照明、凸凹纹理映射以及相对于其它物体的位置。得到的结果就是消费者或者观察者所能看到的完整图像。
对于电影动画来说,需要渲染几幅或几帧图像,并且将这些图像在动画制作程序中将它们链接在一起。大多数的三维图像编辑程序都能够完成这项工作。
渲染的图像有许多显著的特性,渲染研究的领域,也主要集中在寻找:高效模拟这些特性的方法。有些特性只与特定的算法有关,有些却与多个算法相关。
研究人员已经研究出了许多渲染算法,渲染软件可以使用多种不同的技术,以生成最终图像。
对场景中的每束光线进行跟踪不太现实,并且需要耗费大得惊人的时间。如果没有采样进行很好的约束,即使是一部分光线的跟踪以生成图像也需要非常大量的时间。
所以,大致可以分为四类的更加高效的光线传输模型技术就应运而生。第一类是栅格化,包括扫描线渲染,这种方法考虑场景中的物体并将它们投影一幅图像,但是缺乏一些高级的视觉效果;第二类是光线投射,将场景从不同视角观察,只根据几何与反射强度的基本光学原理计算观察到的图像,也可能使用蒙特·卡罗方法减少人为噪声;第三类是辐射着色,使用有限元分析方法模拟光线在表面的散射;第四类是光线跟踪,类似于光线投射,但是使用了更加先进的光学模拟方法,并且通常使用蒙特·卡罗方法以实现更加真实的结果,但是这样做的代价通常是速度的大幅度降低。
大多数高级软件使用多种技术的组合,以在合理的开销范围内,实现足够好的结果。
图像的高层次表示有必要包含与像素不同的元素,这些元素称为基元。例如,在示意图中线段与曲线是基元;在图形用户界面中,窗口与按钮是基元;在三维渲染中,三角形与空间多边形是基元。
在像素到像素渲染速度很慢无法实现的任务中,基元到基元的实现方法可能就能派上用场。在这种方法中,循环遍历每个基元确定它将影响图像中的哪个像素,然后相应地修改那个像素。这种方法称为栅格化,这是当今所有图形卡都用的渲染方法。
栅格化经常要比像素到像素的渲染速度快。首先,图像中的大块区域可能根本没有基元,栅格化就可以忽略这些区域,而像素到像素的渲染方法却必须遍历这些区域;其次,栅格化可以提高缓存一致性并且可以利用图像中同一个基元占据的像素通常是连续的这样一个事实从而减少冗余操作。正是由于这些原因,栅格化通常是需要交互式渲染的场合选择的一种方法,但是像素到像素的实现方法经常可以生成更高质量的图像,同时由于没有栅格化那么多的前提条件所以更加通用。
栅格化有两种主要的形式,不仅整个表面或者基元进行渲染,而且表面顶点全部进行渲染,以及用相邻顶点简单颜色混合来渲染位于顶点之间的表面上的像素,由于这种方法不使用复杂的纹理实现图像连续,所以这种方法已经取代了较旧的栅格化方法,并且由于简单的纹理可以节省内存空间,所以通过使用图形卡的已经繁重的浓淡效果处理功能仍然可以得到更好的性能。旧的方法如果不使用复杂的纹理就会在图像逐个表面覆盖纹理的时候形成块状效应,并且由于像素之间没有颜色渐变所以表面看起来也不光滑。有些情况下设计人员在某些表面上使用栅格化的方法,而根据其它表面相对于其它相交表面的角度使用其它的方法,这样一方面可以提高处理速度,另外也仍然可以保证整体效果。
光线投射主要用于如三维电脑游戏以及动画等实时模拟场合,在这些场合下,细节并不太重要或者是通过人为制造细节可以得到更好的计算效率。通常在需要多帧图像生成动画时就会出现这种情况。如果不使用其它的技巧,这种方法得到的物体表面通常看起来比较扁平,就好像场景中的物体都是经过光滑处理的糙面。
建好的几何模型从外部观察点逐点、逐线进行分析,就如同是从观察点投射出光线一样。当光线与物体交叉的时候,交叉点的颜色可以用几种不同的方法来计算。其中最简单的方法是用交叉点处物体的颜色表示该点的实际颜色;也可以用纹理映射的方法来确定;一种更加复杂的方法是仅仅根据照明因数变更颜色值,而无需考虑与模拟光源的关系。为了减少人为误差,可以对多条相邻方向的光线进行平均。
另外也可以对光的特性进行大致的模拟:简单计算从物体到观察点的光线。另外的一些计算涉及到从光源到物体的入射角,以及根据光源的强度计算像素的亮度值。此外还有一些模拟使用辐射着色算法绘制的照明结果,或者使用这两种信息的组合。
辐射着色是模拟反射光线如何反射到其它表面以及如何照亮周围环境的方法。这种方法可以生成较为真实的浓淡效果,并且更加易于捕捉室内场景的环境光。一个经典的例子就是墙角处阴影的样子。
这种模拟的光学基础是特定物体表面某一点的漫反射的光线散布在在很大的方向范围内并且会照亮周围的环境。
各种模拟技术的复杂性可能会有所不同。许多渲染方法所用的辐射着色模型都非常原始,它们只是简单地根据环境因数变化照亮整个场景。但是当高级的辐射着色与高质量的光线跟踪算法组合在一起使用的时候,它们能够生成相当真实的图像,尤其是对于室内场景更是这样。
在高级的辐射着色模拟中,递归的有限元分析算法不断地将光线在模型表面之间来回反射,直到达到一定的递归条件为止。这样一个表面的色彩就会影响其它相邻表面的色彩,反之亦然。整个模型(有时也包括空白空间)的照明结果保存起来,在光线投射或者光线跟踪模型中作为输入使用。
由于这项技术的递归特性,所以对于复杂物体的模拟速度非常缓慢。一些先进的辐射着色计算方法可能只计算房间中从墙面、地板与房顶反射的环境光,而并不计算复杂物体反光对于辐射着色的影响,或者在辐射着色计算中使用使用同样尺寸及纹理的简单物体取代复杂物体。
如果场景中需要重排的辐射着色物体很少,那么可以在多帧画面中重复使用同样的辐射着色数据,这样就使得辐射着色一方面可以改进光线投射中的扁平效果,另外一方面每帧的渲染时间也不会受到很大的影响。
正因为如此,辐射着色已经成为领先的实时渲染方法,并且已经用于最近大量著名的长篇三维动画电影从头到尾的制作过程。
光线跟踪是与扫描线渲染和光线投射开发的同样技术的延伸,同那些方法一样,它可以很好地处理复杂物体,并且也可以用数学方法描述物体。与扫描线渲染和光线投射不同的是,光线跟踪几乎是一项蒙特·卡罗方法,蒙特·卡罗方法是一项基于从模型中随机得到的一组采样进行平均的技术。
在这种方法中,采样是假想的从场景物体发出与观察点相交的光线。在重点考虑阴影、折射与反射等需要复杂精确渲染的场合这种方法就可以派上用场。
在最终要求产质量量渲染效果的光线跟踪中,通常每个像素都要多条光线,并且不仅仅跟踪到第一次相交,而是需要按照“入射角等于反射角”这样的光学定律以及更加高级的处理折射与粗糙表面反射的定律处理多次连续反射。
一旦光线遇到光源或者更可能出现的是光线反射次数已经达到设定的限制,那么最终点的表面照明就通过上面的方法确定下来,并且经过多次反射发生的变化也可以用来估计在观察点看到的亮度。每个采样点、每个像素都要重复这个过程。
在有些场合中每个交点可能生成多条光线。
作为一种非常有效的方法,光线跟踪的实时处理速度太慢,直到最近也没有在任何要求质量的短片电影中获得应用,尽管它已经开始在一些特殊效果要求的场合开始使用,如在需要高质量甚至是Photorealistic的脚本片断的广告中开始使用。
但是,降低不需要高质量细节部分的或者与光线跟踪特性无关部分的计算量的努力已经使得光线跟踪的应用更加广泛。当前已经出现了一些至少已经处于原型阶段硬件加速的光线跟踪设备,在一些游戏演示中也有实时软件或者硬件光线跟踪的应用。
由于所需计算量非常大,一项逐步进行的工作的细节渲染通常对应于当时工作的进度。因此,在建模的开始阶段可以使用线框模型或者光线投射进行处理,即使是最终的目标结果是要使用辐射着色的光线跟踪也可以这么做。另外也经常只对一部分进行高质量的渲染,而对于当前工作无关紧要的部分剔除出去。
对于实时渲染来说,适当的做法是简化一个或者多个共同的近似,将关键场景调到正确的参数,并且要将参数调整到能够获得最好的效果。
另外还有些一些不太出名的渲染方法,如球谐函数。这些技术由于速度较慢、缺少实用性或者仅仅因为它们还不太完善所以不太出名,或许其中的某些技术能够提供一些新的解决方案。
不管系统采用哪种渲染方法,都必须解决采样问题。本质上来讲,渲染过程试图用有限数目的像素将图像空间的连续函数表现成颜色。根据采样定理的结论,扫描频率必须是点速(dot rate)的两倍,点速与图像分辨率成正比。用简单的话来说就是图像不能显示小于一个像素的细节。
如果使用一个未经验证的渲染算法,那么图像函数中的高频成分将会导致最终图像中出现难看的混叠现象。混叠现象通常表现为锯齿图或者是可见像素栅格处的锯齿边。为了去除混叠现象,所有的渲染算法如果想要生成好看的图像的话都必须对图像函数进行滤波以去除高频成分,这个过程叫作抗混叠。
电影渲染通常在一个紧密相连的计算机组成的网络渲染集群(render farm)。
当今用于电影制作三维图像描述发展水平代表是Pixar设计的RenderMan 场景描述语言。它与VRML这样较简单的三维文件格式或者是经过修改专门用于三维硬件加速的OpenGL以及DirectX等应用程序编程接口(Application programming interface)有所不同。
电影渲染软件包括:
真实感渲染的实现都是某种程度的物理仿真 —一些计算都是真实物理过程的模拟或抽象。
“基于物理”这个术语表示是使用在渲染领域之外也被广泛接受的物理模型或者近似,在渲染领域逐渐创建起了相关的特殊技术。
这些物理基本概念都相当直白,但是却难于以少数的计算,得到精确且完整的结果;一个非常优秀的算法或者实现方法对于更加通用的渲染目的来说却可能难以理解。为了满足健壮、精确及实用的要求,实现方法都必须是多项不同技术的复杂组合。
渲染研究工作主要集中在科学模型的改进及其高效应用。
渲染方程是渲染中的一个核心理论概念,它是渲染不可感知方面的最抽象的正式表示,所有更加完善的算法都可以看作这个方程特殊形式的解。
含义是:在一个特定的位置与方向,出射光Lo)是发射光Le与反射光之和。反射光是所有方向入射光之和Li乘以表面反射率及入射角。通过交叉点,这个方程将入射光与出射光联系在一起,它代表了场景中完整的光线传输即光线的所有运动。
双向反射分布函数(BRDF)描述了一个光线与物体表面相互作用的简单模型:
光线相互作用通常用更加简单的模型进行近似:漫反射与镜面反射。这两种都可以是双向反射函数。
实际上渲染是完全关于光物理粒子性方面研究的技术,即几何光学。将光在本质上看作跳动的光子这种简化是合适的:在大多数场合下,光的波动性是可以忽略的,并且也非常难于模拟。著名的光波动现象有衍射,如CD以及DVD上的颜色,以及如LCD上看到的极化现象。如果这两种类型的效果,通常对反射模型进行针对表现效果的调整。
尽管很少受到关注,但是对于人类视觉的理解对于渲染来说非常重要,这是因为图像显示与人类视觉都有一定的约束范围。渲染工具几乎可以模拟无限范围的亮度与颜色,但是电影、显示器等当今的显示设备都不能处理这么大的范围,通常都需要压缩甚至舍弃一部分信息。人类视觉也有类似的限制,因此不需要为了真实感而使用很大范围的图像。视觉研究可以帮助解决将图像用显示器显示的问题,以及建议渲染中使用哪些捷径,一些细微的信息是无法感知的。这个相关的主题是色调映射。
在渲染中使用的数学基础有:线性代数、微积分、数值分析、数字信号处理以及蒙特·卡罗方法。