《2022年elvishray新算法框架.doc》由会员分享,可在线阅读,更多相关《2022年elvishray新算法框架.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、elvish ray新算法框架Version 2.0.0.0Len3dCopyright 2007 Len3d.All rights reserved.前言本文描绘了一种渲染器的新算法框架,只是我个人对elvish ray的建议,仅供参考。需求分析mental ray是一个极其优秀的混合渲染器,尤其是它的光线追踪功能,做得特别好,特别智能,尽量用最少的光线获得最好的结果(特别好的采样分布算法和自动减少无效采样),但它仍然是基于传统的光线追踪算法框架开展而来的,按我的使用经历,这带来特别多咨询题。在mental ray中,对不同的光线类型,如eye ray, shadow ray, reflec
2、ted ray, refracted ray, finalgather ray等,都要分别做不同的优化,导致算法特别复杂,而各种光线的表现又不尽一样,导致使用时特别难预测各种光线的行为,也就特别难预测到达的效果与渲染时间,这关于产品级的制造是特别大的烦恼,意味着开支预算变得困难。尽管mental ray尽量让参数的变化直截了当与渲染时间的变化呈线性关系,但关于reflected ray和refracted ray,众所周知,其递归光线追踪的过程构成一颗二叉树方式,称为光线树,如此关于K次反射/折射,R个象素,总供需要计算的光线数目近似于(2k+1-2)R条,这是呈指数增长的,因而递归层数K一深
3、,整个渲染过程立即就慢下来了,更糟糕的是,假如再开启阴影,每个交点处至少发射一条阴影测试光线,更一般的,开启区域阴影时,不妨设每个交点处平均发射m条shadow ray,则所需的光线总数约为(2k+1-2+m(2k-1)R条,这种增长特别可怕,而且不同的特效同时开启时,速度的变慢不是简单的线性组合,而是会互相妨碍,这确实是为什么单独打开mental ray的某一种特效,速度尚可接受,但同时打开几种特效时,速度就慢得让人难以忍耐了,因而想要用mental ray到达特别好的效果和渲染时间的平衡,需要大量的试验和人工参数调整,需要使用者有特别丰富和老道的使用经历,即便如此,调整mental ray
4、诸多的复杂而神奇的参数,仍然是一种痛苦的折磨。总结起来,mental ray在这方面的缺点主要有:1. 基于传统的光线追踪算法框架,各种特效增加的渲染时间与象素(包括自习惯采样产生的子象素)数目成正比。因而,假设你只想增加景物边缘的反走样,而不在乎反射/折射的精细程度,mental ray仍然发射更多的反射/折射光线,忠实的增加渲染时间。2. 各种光线类型的优化方法不统一,算法复杂维护困难,且关于产品级的应用,难以预测渲染时间的开销,难以预测并保证最终效果,总是要求用户试了才明白。3. 不管mental ray如何优化其算法,反射/折射光线,仍然与反射/折射层次数呈指数增长关系。4. 同时开启
5、多种效果时,渲染时间不是单独开启各种效果时渲染时间简单的线性组合,而是会互相妨碍。例如,射/折射层次增加亦会使阴影光线数目呈指数增长。5. 参数复杂而且神奇,难于调整,需要极为丰富的使用经历。想要到达效果和渲染时间的平衡,需要大量反复的调整和试验,妨碍制造效率。针对这些咨询题,我设计了如下这种新算法框架,希望能有助于处理这些咨询题,事实上该架构也特别简单,其核心思想仍然是分而治之的思想,我借鉴了Reyes的思想,并对Reyes与光线追踪算法中各自的一些概念进展了推行,提供了一种统一的架构。算法框架描绘1. 光线类型的推行Reyes算法只处理一种光线类型,确实是mental ray中称为eye
6、ray的光线,它只渲染观察者直截了当可见的景物,Reyes还有一个区别于mental ray这类光线追踪渲染器的主要特点,确实是将Hidden Surface Removal(简称hiding)和shading过程分开,如此的好处是,增加物体边缘的反走样,不会增加多少渲染时间,由于更耗时的shading过程由另一个与象素数目(由采样数目操纵)无关的参数shading rate操纵。我将shading rate的概念由eye ray推行到各种光线类型,reflected ray, refracted ray, shadow ray, finalgather ray等都有各自的shading ra
7、te,且规定它们的shading rate均不小于eye ray的shading rate,如此我们为每块由细分和镶嵌生成的microgrid,匹配一系列分别对应于各种光线类型的irradiance cache(这里借用并推行了irradiance cache的概念),每当一块microgrid被某条光线击中时,便对整张microgrid上的每个顶点进展针对视点的shading(这尽管可能导致浪费一部分shading结果,但是能够充分利用SIMD并行计算加速,甚至能够利用GPU),这就涉及到如何执行用户编写的shader程序的咨询题了。由于我们规定其余各种光线的shading rate总不小于
8、eye ray的shading rate,因而在Reyes针对视点细分生成的microgrid上的每个顶点进展shading总是正确的。然而,以reflected ray为例,对microgrid上的每个顶点都计算反射往往是不必要的,因而我们能够依照reflected ray的shading rate,只对microgrid上的一部分顶点计算反射,这部分顶点通过在microgrid上按相应间隔取隔行和隔列的顶点获得。假设要利用SIMD并行shading,我们需要有RenderMan一样的编译器与SIMD虚拟机,shader代码执行到调用trace_reflect函数的时候,便搜集microgr
9、id上需要计算反射的点(这些点被称为reflected points,相应的有refracted points, shadow points, finalgather points等),利用基于SIMD的并行光线追踪一次性得到计算结果,而关于microgrid上剩余的未计算反射的点,则由microgrid良好的性质能够简单的通过插值相邻的reflected points获得,同样由trace_reflect函数返回插值结果,如此,我们不必为finalgather rays构建特别的基于八叉树或其它特别数据构造的irradiance cache,而将irradiance cache的概念推行到所
10、有光线类型,统一了它们的处理方法,这同时也是对Reyes算法的一种扩展。值得留意的是,irradiance cache的值,对不同的光线类型,可能是view-dependent的,也可能是view-independent的。关于view-dependent的那些,比方reflected irradiance cache, refracted irradiance cache,它们都仅是针对场景中唯一的视点(eye rays)有效,而关于从其它点发射出的光线则是不正确的,因而关于secondary rays与景物相交时的shading,我们则按传统的方法单独为该点计算反射/折射等效果,并不使用i
11、rradiance cache中的值,所以,参考Razor架构的做法,关于shading language的predefined variables中那些view-independent的变量,如N, dPdu, dPdv等(假如我们假设shading总发生在camera space中的话),我们能够像irradiance cache一样一次计算好并储存下来反复使用,而关于其中那些view-dependent的变量,如P, I等,则每次均重新计算。关于那些view-independent的irradiance cache,如shadow irradiance cache, finalgathe
12、r irradiance cache,不管光线从哪个视点发出,都能够使用cache中的值,如此防止了重复计算,同时由于我们只在有光线击中某块microgrid时,才对该microgrid计算光线所需的irradiance cache值,这是lazy evaluation或说deferred shading的思想。2. Russian Roulette方法的推行前述对光线类型的推行,有望在我们前面对mental ray的算法复杂度的分析中,以一定比例减小R这个因子,设有n种光线类型,则相当于将R分解为R1, R2, , Rn的线性组合,且各种光线的Ri因子中,由各自的shading rate决定
13、,但这仍然只是降低了复杂度中的线性因子,而复杂度中更主要也更可怕的真正反映光线追踪特性的递归光线追踪部分的因子,却没有降下来,即2k+1-2+m(2k-1)这部分。回忆Photon Mapping算法中特别重要的Russian Roulette方法,每次获得一个交点时,只是随机的依照光照模型中各项系数因子的大小选择一种光线类型,且只发射一条光线,假如我们借用这种方法(同意类似mental ray通过shader实现),那么递归光线追踪部分的因子就会降为K,整体的复杂度能够近似表示成K(R1+R2+Rn)。然而应留意到,Russian Roulette方法尽管能够通过理论证明是正确的,但当R不够
14、大(超采样缺乏)时,产生的图像会有特别多噪点。为理处理这个咨询题,回忆Photon Mapping中使用Russian Roulette为什么会正确,由于最终渲染时,需要使用density estimation或final gather等技术来可能外表上各点的间接照明值,这实际上能够理解成一种filtering过程,考虑microgrid本身的构造,特别容易进展相邻顶点的irradiance cache中的值的filtering,这能够理解为推行的irradiance filtering技术,这种技术有一个缺陷,由于一个物体特别可能会被分割成多个相对独立的microgrid,对microgri
15、d边界处的顶点进展irradiance filtering会造成瑕疵,所以这能够通过保持microgrid分割边界之间的连接关系来处理,但如此使得各个microgrid不能独立处理,留意到Reyes中计算microgrid边界处的dPdu, dPdv等值时,也会遇到类似的困难,我们能够借用类似的处理方法,比方让每块microgrid略微比实际的大一些即可。另外,关于final gather,由于microgrid本身的良好构造,特别容易实现相邻顶点间的neighbor clamping算法,以消除景物边角处的光亮度瑕疵,而不用设计特别的数据构造。3. Multi-resolution Geom
16、etry Caching与Ray Differentials基于观察,我认为能够得到如此一个事实:近处较大(近大远小的道理)的景物,其被反射的影像在渲染图像中一般也较大,远处较小的景物,其被反射的影像在图像中一般也较小。或者能够阐述成景物的照明属性通常对其四周的景物妨碍最大,而对距之较远的景物妨碍较小,即具有照明属性的部分性,同意粗糙的近似甚至忽略不计。除了一些特别的情况,比方拿一个放大倍率特别高的放大镜,看极远处的一个小景物。因而我们一般能够按Reyes算法对场景中所有景物进展细分(或镶嵌,下同),而关于反射/折射等光线,能够直截了当使用同一份细分几何数据,而不需要另外细分,这通常不会因细分
17、缺乏而在图像上产生瑕疵,而且仅使用一份细分几何数据(称为single geometry cache),同时节约了计算量与内存用量,同时不会产生由于相邻多条光线各自对应的细分层次不一致而在图像上造成裂痕的咨询题,对内存的使用量及细分所需时间的预测也变得容易了一些。留意到Reyes只处理位于视棱域(frustum)内的景物,而光线追踪算法需要处理所有景物,且Reyes的细分是通过将景物透视投影到屏幕空间,依照其包围盒大小与shading rate操纵的,而位于投影平面前的景物,不能特别好的透视投影到该平面上,但又留意到这部分景物往往亦具有前述的照明属性的部分性,其可见部分只能通过妨碍与之相靠近的位
18、于视棱域内的景物而表如今最终渲染图像上,因而我们对其进展到投影平面的平行投影(而非透视投影),以此决定其细分精度,而对位于Z轴另一侧的不直截了当可见的景物,我们利用镜像性质,应用与上述相应的法则进展细分,同样使离视点较近的景物细分得较精细,离视点较远的景物细分得较粗糙,这称为对称细分法。尽管使用single geometry cache一般能够得到较理想的结果,但也存在如前面举例的放大镜咨询题,关于该类咨询题,RenderMan中光线追踪的处理方法是类似MIP-MAP算法,构建同一microgrid的多分辨率细分拷贝(即Multi-resolution Geometry Caching),在渲
19、染时动态的计算ray differentials,按其大小选择适宜的geometry cache拷贝,Razor的方法也特别类似,但它会对相邻的拷贝按ray differentials大小进展插值。不管如何两种方法都十分复杂,同时需要特别处理烦恼的裂缝咨询题,而放大镜这种情况并不常见,我认为更简单更容易操纵的方法是像Reyes一样,同意单独调整某个景物的shading rate,比方在放大镜咨询题中,我们只需适当减小放大镜中能够看到的细分缺乏的景物的shading rate即可,然而在放大镜的放大倍率特别大时,该景物可能会被分割得特别精细,但实际上它在渲染图像中直截了当可见的部分却特别小,因而
20、这对Reyes算法是一种损害,因而我引入了Multi-type Geometry Caching的概念,即对每个物体,都对应每种光线类型持有一份细分拷贝,如此一样类型的光线总与同一份拷贝求交,因而不会产生裂缝。在一般情况下,每个物体只持有一份针对eye ray的eye geometry cache,其它光线类型的geometry cache简单的指向它,而只有在用户手动调整另一种光线类型的shading rate时,才针对该光线类型生成相应的geometry cache(例如针对reflected ray就生成reflected geometry cache),这有利于用户直截了当操纵并预测细
21、分数量,简单而不失灵敏性。因而,在渲染中能够不需要计算ray differentials,或者能够考虑利用ray differentials的可能,使不同类型的shading rate的值的选择自动化,不必人工干涉。4. Multi-resolution kd-tree使用Multi-resolution Geometry Caching的一个好处是,关于大的ray differentials,cache中包含更多的景物,但景物能够分割的更粗糙些,关于小的ray differentials,cache中包含更少的景物,但景物应分割的更精细些。这个性质使得cache能够保持相对固定的大小。为了在
22、基于kd-tree加速的光线追踪算法中利用这个性质,我们需要略微改良一下kd-tree的构造,如图:通常在kd-tree中追踪每条光线的复杂度为O(logN),N为景物数目,为了保持kd-tree的加速性质,而不由于使用了Multi-resolution Geometry Caching而改变,我们必需能够动态改变kd-tree的构造,但改变之后所得的形态应该与按传统的kd-tree方法构造的形态类似(假如采纳按物体分组的方式,每个物体都构建本人单独的kd-tree,假设有M个物体,则算法复杂度变为O(M log(N/M),且O(M log(N/M)=O(logN),即便使用了层次包围盒算法,
23、复杂度也是O(M log(N/M)=O(logN),且增加了算法盒储存构造的复杂度,故不采纳该方法),考虑几何体分组的方式,假设按物体分组,则不能特别好的反映景物在空间中的分布,故不合理。因而我们不必按照物体分组,而直截了当按kd-tree的结点分组,将位于同一个结点中的所有景物当作一个处理单元,由此得到如下图的kd-tree构造,它保持了kd-tree的加速性质,即改变细分层次之后所得的形态与按传统的kd-tree方法构造的形态类似,且以结点作为根本处理单元。为了保持Multi-resolution Geometry Caching的性质,我们在实现中采纳延迟载入的思想,且仍然动态构建kd-
24、tree,算法步骤如下:当光线进入某个node时,检查是否已分割过(分割指将node中景物按分割平面分类,建立children nodes的过程),假设未分割过,则按照未经细分的几何体(称为top-level geometry,如NURBS,Subdivision Surfaces等,这种几何表示方式的好处是特别节约储存空间)的包围盒分割,直至满足分割终止条件,建立leaf node,假设leaf node中只有能够直截了当快速光线追踪的根本图元,比方polygons或triangles等,则光线直截了当与这些图元求交,假设leaf node中包含更复杂的top-level geometry,
25、则需要进一步细分为根本图元,比方microgrid等,然后再光线追踪(由于大量研究指出细分后再追踪仍然优于直截了当光线追踪,不只是速度上,还有关于软件体系构造的设计和维护等方面更有利),这种leaf node称为expanding leaf node。这时,我们依照光线的ray differentials,决定所需的细分层次level n,并依次生成一系列从level 0到level n的细分拷贝,我们能够用增量法防止重复计算,这要求细分与分割交替进展,比方关于level 0我们直截了当用expanding leaf node中的景物对应的microgrid拷贝(由于已满足分割终止条件),关于
26、level 1,我们先细分level 0中的景物,再进一步按终止条件分割,同样,我们生成所有不同精度的expanding leaf node,并将它们储存再磁盘文件中,而只将风格平面的信息放在内存中(增量法还使高层次结点的分割平面的选择更快,由于如今只按细分较粗糙的microgrid选择分割平面,而不用在大量完全细分后的microgrid中选择),当光线进入expanding leaf node时,先按ray differentials选择一个细分层次,当光线进入某个sub-leaf node时,才载入相应的细分拷贝,并求交,expanding leaf node及其子结点均有一标记标明它们各
27、自由哪个细分层次生成,假设细分层次关于当前ray differentials不够精细,则同样用增量法补充生成细分层次,并追加到磁盘文件中,这种改良后的kd-tree称为Multi-resolution kd-tree。5. Geometry InstancingGeometry Instancing使得我们在渲染成千上万个一样物体的实例时只需要大约一个该物体的内存用量,我们仍然获取每个物体的包围盒,按照包围盒分割并构造kd-tree(由于一个包围盒的数据量几乎和一个三角形的数据量一样多,因而,为每个三角形储存其包围盒并不能减少多少内存用量,但总比没节约的好),由于在不同方位的实例,其shadi
28、ng结果也不一样,因而应在top-level geometry中储存与实例数目一样的多份irradiance cache拷贝,分别对应于不同实例,但如此又会导致irradiance cache所需的内存量过大。该方法的主要创新之处有:1. 不使用紧缩的Bounding Box,而直截了当在建立leaf时利用结点的包围盒对三角形进展裁剪(尽管更复杂,但是毕竟只进展一次)。2. 运用了两遍法使得GPIT(Geometric Primitive Indexing Table)连续顺序储存的实现成为可能。3. 使用GPIT,并将光线变换回景物部分空间求交。对Motion Blur,先按shutter
29、open和shutter close的矩阵变换光线,再对所得光线本身插值。6. Ray-tracing Of Arbitrary Geometry为了光线追踪任意的几何体(假设是该几何体总能转换为micropolygon,最终转换为triangles或motion triangles,由于我们选择kd-tree作为光线追踪核心的加速构造,因而这里的讨论均是针对kd-tree的),我们不可能预先细分生成足够精度的三角形逼近,随后再建立kd-tree,并进展光线追踪,由于在高质量渲染中,完全细分产生的三角形数量往往过于宏大而难以直截了当处理,因而我们需要一个动态的光线追踪框架,它能够依照当前光线指
30、定的精度要求(通过ray differentials计算),动态的改变几何体的细节等级,即动态的改变所生成的三角形的数量和形状,而这又导致kd-tree的构造必须做出相应的调整,同时我们应当适当的操纵内存使用量,既不能使用过分多的内存,也不能每次都重新细分(Retessellation)几何体,导致大量的计算,这就要求我们有适当的caching策略。最好的情况确实是能够将内存用量限制在一定的范围,而在此范围中,能够渲染无限制大小的场景,同时将渲染时间最大化,为了实现这一点,我们有一个全局的geometry cache,当渲染中需要申请新的内存块,而内存用量又超出用户预设的限制时,我们则通过Le
31、ast Recently Used(LRU)算法,踢掉旧的内存块,而让新的几何体使用这块内存。特别明显,这要求我们将算法中动态生成的几何体,作为cache的一部分,能够按需求删除和重建,假设我们已经有了如此一套cache系统(我们确实有),如今来考虑要对系统做什么改变,并引入了什么新算法。我们将首先描绘GPIT算法时如何实现Geometry Instancing的,随后针对动态光线追踪对其进展扩展。GPIT是Geometric Primitive Indexing Table的缩写,作为一张表,其最明显的特点确实是它在内存中确实是一张连续存放的表,即它是一块连续的内存块,如此特别明显的好处确实
32、是访咨询起来更加高效,而且只需要为每个带有GPIT的结点分配一次内存,而不像特别多实现中一样,需要屡次分配,这明显提高了光线追踪的效率。GPIT中并不储存真正的几何数据,而是连续储存表示几何数据相关于基地址的索引值,和基地址本身。如此尽管增加了一次间接寻址,比直截了当储存几何数据访咨询起来慢一些,但是由于GPIT本身比拟小,特别可能完全位于CPU的高速缓存中,而且其中储存了下一个几何体的位置,因而总能通过CPU的预取指令提早预取下一个几何数据,提高缓存命中率,进而提高几何数据的访咨询速度。GPIT正是通过储存几何数据的索引值来轻松的实现Geometry Instancing,在光线追踪过程中,
33、我们遍历GPIT,通过间接寻址访咨询几何数据,每次遇到一个新的物体实例(Object Instance),我们都将光线按照物体实例的camera to object矩阵变换到物体的部分坐标系,假如物体实例有transform motion blur,即有通过对物体实例的空间变换产生的运动模糊,则我们能够先对camera to object矩阵与motion camera to object矩阵按照光线所对应的时间进展插值,然后再变换光线。但由于对矩阵本身进展插值比拟复杂,需要分解矩阵为不同的变换部分,按各自的特点分别进展不同类型的插值,再组合起来,而对矩阵做简单的线性插值又会产生扭曲的结果,因
34、而我们能够先分别按照这两个矩阵对光线进展变换,再对得到的两条光线按照时间插值,获得部分坐标系中的光线后,即可与GPIT中索引值所指的几何数据进展求交,如此,不管一个物体有多少个物体实例,只需要储存多个GPIT,而不需要储存多个真实的几何数据,而GPIT本身相对较小,因而这极大的节约了内存。下面我们讨论如何扩展GPIT(eXtended GPIT,简称XGPIT),使之能够处理动态光线追踪。XGPIT及相关数据构造如下图:MTGP是Multiresolution Tessellated Geometric Primitives的缩写,每个primitive对应一个MTGP,其中包含了该primi
35、tive各个细节层次的镶嵌表示。需要保证MTGP中每次Retessellation后生成的三角形顺序均与之前的顺序一样。能够考虑增量式细分,即后一层次的细分表示在前一层次的细分表示的根底上生成,只计算并储存那些新参加的顶点。(1) 生成在相应结点包围盒内的sub-GPIT。(2) 为了加速,能够将静态的triangles和motion triangles合并到sub-GPIT中。(3) 将sub-GPIT放入对应的kd-tree结点中分割,建立sub-tree。(4) 各个primitive互相独立的细分,生成各自对应的MTGP。RT时,对动态部分进展两步查找,先按patch ID找到patc
36、h,然后在patch中按当前光线的ray differentials决定的细分层次寻找相应的sub-triangle ID指示的三角,与之求交,这里去掉了指针的概念,由于flushable几何体均能够重建,因而先按ID查找,假设不存在则重建(通过Retessellation)。XGPIT将几何体分为两部分储存,静态和动态部分。如此的好处是改变动态部分时,静态部分不受妨碍,由于只有动态部分需要重建,这同意我们单独处理动态部分,而且能够特别方便的将静态部分合并到动态部分中去统一处理。静态部分即不会再改变的triangles和motion triangles部分,而动态部分是我们讨论的重点,这里面能
37、够包括任意的高级几何体,这是一个指向高级几何体指针的列表,为了加强系统的灵敏性,能够泛化对高级几何体的操作,如此我们便拥有了一个能够任意添加新的几何体类型的开放系统(类似REYES),我们再这里将所有高级的Geometric Primitives统称为primitive,这能够包括Parametric Surfaces, NURBS Surfaces和Subdivision Meshes等。首先,我们看看kd-tree如今的根本构造如图:由于我们只是扩展了GPIT,因而不必改变kd-tree结点的构造,而且关于XGPIT所指的sub-tree,能够重用同样的原先为kd-tree写的建立与遍历代
38、码。如今的光线追踪过程为,首先,primitives得到其包围盒,因而primitive需要一个抽象的Bound操作,随后按照primitives的包围盒建立kd-tree的静态部分,直到所有primitives都被放入leaf node指向的GPIT或XGPIT中(假设不存在需要动态光线追踪的高级几何体,则XGPIT退化为GPIT,这个性质保证了中小规模的渲染速度不受妨碍),关于XGPIT,每次追踪光线时,推断sub-tree是否已建立,假设已建立,则按ray differentials与Edge Length比拟结果来选择适宜的细分层次,假设相应的node未建立,则遍历primitives
39、,调用其抽象操作,Tessellate(int level),生成相应层次的细分后三角形(如此设计具有灵敏性,由于primitive之间互相独立细分,便于并行,但是详细的细分方法却没有限制,而且与kd-tree的详细构造无关,因而能够使用任何可能的细分方法。同时primitive未必确实是数学表示上的单块patch,能够依照performance选择多块patch甚至整个surface作为primitive来一起细分,因而终究以什么作为细分操作的根本单位能够灵敏的选择),将这些三角形与leaf node的包围盒做测试,将位于该包围盒中的三角形参加sub-GPIT中,建立起sub-GPIT,并将
40、leaf node中的静态部分合并进去,然后使用通常的kd-tree建立方法生成sub-tree,并让XGPIT中相应层次的node指针指向该sub-tree,假设sub-tree未建立,则估算所有可能层次的Edge Length并写入XGPIT中(能够通过包围盒大小估算,也能够做试探性的细分,进展更准确的估算),之后按已建立sub-tree的情况处理。总结回忆前面提到的mental ray的一些缺点,我们逐一调查新算法框架是否能够处理这些咨询题:1. 新方法分开了hiding和shading过程,分解了各种特效的操纵参数(主要是shading rate),故各种特效增加的渲染时间不再与象素数
41、目有关,同时它们能够各自单独操纵,增大反走样并不增加反射/折射。2. 新方法统一了多种算法,用同一个框架实现各种光线类型的优化,明晰且易于维护,由于通常只使用eye geometry cache,因而Reyes渲染器的用户能够特别容易的让他们的经历派上用场,对渲染时间、内存用量与渲染结果的预测更加容易。3. 由于同意在各种shader中运用Russian Roulette(而不仅是Photon Shader),因而渲染时间与反射/折射层次数的关系由指数降为线性。4. 各种效果由各自的参数独立操纵,开启多种效果的时间复杂度能够简单表示为各种效果的时间复杂度的线性组合。5. 分解各种特效的操纵参数尽管增多了参数数目,但不同类型光线的对应参数的意义都是一样的,且十分直观而易于调整,不但提高了渲染速度,还提高了制造效率。总之,我个人认为elvish ray新算法框架在理论上可行,关键确实是期待事实上现了。