elvishray新算法框架.docx

上传人:小飞机 文档编号:1893848 上传时间:2022-12-24 格式:DOCX 页数:10 大小:173.20KB
返回 下载 相关 举报
elvishray新算法框架.docx_第1页
第1页 / 共10页
elvishray新算法框架.docx_第2页
第2页 / 共10页
elvishray新算法框架.docx_第3页
第3页 / 共10页
elvishray新算法框架.docx_第4页
第4页 / 共10页
elvishray新算法框架.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《elvishray新算法框架.docx》由会员分享,可在线阅读,更多相关《elvishray新算法框架.docx(10页珍藏版)》请在三一办公上搜索。

1、elvish ray新算法框架Version 2.0.0.0Len3dCopyright 2007 Len3d.All rights reserved.前言本文描述了一种渲染器的新算法框架,只是我个人对elvish ray的建议,仅供参考。需求分析mental ray是一个极其优秀的混合渲染器,尤其是它的光线追踪功能,做得非常好,非常智能,尽量用最少的光线取得最好的结果(很好的采样分布算法和自动减少无效采样),但它依然是基于传统的光线追踪算法框架发展而来的,按我的使用经验,这带来很多问题。在mental ray中,对不同的光线类型,如eye ray, shadow ray, reflected

2、 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 ray的光线,它只渲染观察者

6、直接可见的景物,Reyes还有一个区别于mental ray这类光线追踪渲染器的主要特点,就是将Hidden Surface Removal(简称hiding)和shading过程分开,这样的好处是,增加物体边缘的反走样,不会增加多少渲染时间,因为更耗时的shading过程由另一个与象素数目(由采样数目控制)无关的参数shading rate控制。我将shading rate的概念由eye ray推广到各种光线类型,reflected ray, refracted ray, shadow ray, finalgather ray等都有各自的shading rate,且规定它们的shading

7、rate均不小于eye ray的shading rate,这样我们为每块由细分和镶嵌生成的microgrid,匹配一系列分别对应于各种光线类型的irradiance cache(这里借用并推广了irradiance cache的概念),每当一块microgrid被某条光线击中时,便对整张microgrid上的每个顶点进行针对视点的shading(这虽然可能导致浪费一部分shading结果,但是可以充分利用SIMD并行计算加速,甚至可以利用GPU),这就涉及到如何执行用户编写的shader程序的问题了。因为我们规定其余各种光线的shading rate总不小于eye ray的shading ra

8、te,所以在Reyes针对视点细分生成的microgrid上的每个顶点进行shading总是正确的。然而,以reflected ray为例,对microgrid上的每个顶点都计算反射往往是不必要的,所以我们可以根据reflected ray的shading rate,只对microgrid上的一部分顶点计算反射,这部分顶点通过在microgrid上按相应间隔取隔行和隔列的顶点获得。若要利用SIMD并行shading,我们需要有RenderMan一样的编译器与SIMD虚拟机,shader代码执行到调用trace_reflect函数的时候,便收集microgrid上需要计算反射的点(这些点被称为r

9、eflected 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,我们则按传统的方法单独为该点计算反射/折射等效果,并不使用irradiance cache中的值,

11、当然,参考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, finalgather irradiance cache,

12、无论光线从哪个视点发出,都可以使用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,对microgrid边界处的顶点进行irradiance filt

15、ering会造成瑕疵,当然这可以通过保持microgrid分割边界之间的连接关系来解决,但这样使得各个microgrid不能独立处理,注意到Reyes中计算microgrid边界处的dPdu, dPdv等值时,也会遇到类似的困难,我们可以借用类似的解决方法,比如让每块microgrid稍微比实际的大一些即可。另外,对于final gather,由于microgrid本身的良好结构,很容易实现相邻顶点间的neighbor clamping算法,以消除景物边角处的光亮度瑕疵,而不用设计特别的数据结构。3. Multi-resolution Geometry Caching与Ray Differen

16、tials基于观察,我认为可以得到这样一个事实:近处较大(近大远小的道理)的景物,其被反射的影像在渲染图像中一般也较大,远处较小的景物,其被反射的影像在图像中一般也较小。或者可以阐述成景物的照明属性通常对其周围的景物影响最大,而对距之较远的景物影响较小,即具有照明属性的局部性,允许粗糙的近似甚至忽略不计。除了一些特殊的情况,比如拿一个放大倍率很高的放大镜,看极远处的一个小景物。因此我们一般可以按Reyes算法对场景中所有景物进行细分(或镶嵌,下同),而对于反射/折射等光线,可以直接使用同一份细分几何数据,而不需要另外细分,这通常不会因细分不足而在图像上产生瑕疵,而且仅使用一份细分几何数据(称为

17、single geometry cache),同时节省了计算量与内存用量,并且不会产生由于相邻多条光线各自对应的细分层次不一致而在图像上造成裂痕的问题,对内存的使用量及细分所需时间的预测也变得容易了一些。注意到Reyes只处理位于视棱域(frustum)内的景物,而光线追踪算法需要处理所有景物,且Reyes的细分是通过将景物透视投影到屏幕空间,根据其包围盒大小与shading rate控制的,而位于投影平面前的景物,不能很好的透视投影到该平面上,但又注意到这部分景物往往亦具有前述的照明属性的局部性,其可见部分只能通过影响与之相靠近的位于视棱域内的景物而表现在最终渲染图像上,所以我们对其进行到投

18、影平面的平行投影(而非透视投影),以此决定其细分精度,而对位于Z轴另一侧的不直接可见的景物,我们利用镜像性质,应用与上述相应的法则进行细分,同样使离视点较近的景物细分得较精细,离视点较远的景物细分得较粗糙,这称为对称细分法。虽然使用single geometry cache一般能够得到较理想的结果,但也存在如前面举例的放大镜问题,对于该类问题,RenderMan中光线追踪的解决方法是类似MIP-MAP算法,构建同一microgrid的多分辨率细分拷贝(即Multi-resolution Geometry Caching),在渲染时动态的计算ray differentials,按其大小选择合适的

19、geometry cache拷贝,Razor的方法也很类似,但它会对相邻的拷贝按ray differentials大小进行插值。无论如何两种方法都十分复杂,同时需要特别处理麻烦的裂缝问题,而放大镜这种情况并不常见,我认为更简单更容易控制的方法是像Reyes一样,允许单独调整某个景物的shading rate,比如在放大镜问题中,我们只需适当减小放大镜中可以看到的细分不足的景物的shading rate即可,然而在放大镜的放大倍率非常大时,该景物可能会被分割得非常精细,但实际上它在渲染图像中直接可见的部分却非常小,于是这对Reyes算法是一种伤害,所以我引入了Multi-type Geometr

20、y Caching的概念,即对每个物体,都对应每种光线类型持有一份细分拷贝,这样相同类型的光线总与同一份拷贝求交,因此不会产生裂缝。在一般情况下,每个物体只持有一份针对eye ray的eye geometry cache,其它光线类型的geometry cache简单的指向它,而只有在用户手动调整另一种光线类型的shading rate时,才针对该光线类型生成相应的geometry cache(例如针对reflected ray就生成reflected geometry cache),这有利于用户直接控制并预测细分数量,简单而不失灵活性。因此,在渲染中可以不需要计算ray differenti

21、als,或者可以考虑利用ray differentials的估计,使不同类型的shading rate的值的选择自动化,不必人工干预。4. Multi-resolution kd-tree使用Multi-resolution Geometry Caching的一个好处是,对于大的ray differentials,cache中包含更多的景物,但景物可以分割的更粗糙些,对于小的ray differentials,cache中包含更少的景物,但景物应分割的更精细些。这个性质使得cache可以保持相对固定的大小。为了在基于kd-tree加速的光线追踪算法中利用这个性质,我们需要稍微改进一下kd-tr

22、ee的结构,如图:通常在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),即使使用了层次包围盒算法,复杂度也是O(M log(N/M)=O(logN),且增加了算法盒储存结构的复杂度

23、,故不采用该方法),考虑几何体分组的方式,若按物体分组,则不能很好的反映景物在空间中的分布,故不合理。因此我们不必按照物体分组,而直接按kd-tree的结点分组,将位于同一个结点中的所有景物当作一个处理单元,由此得到如图所示的kd-tree结构,它保持了kd-tree的加速性质,即改变细分层次之后所得的形态与按传统的kd-tree方法构造的形态相似,且以结点作为基本处理单元。为了保持Multi-resolution Geometry Caching的性质,我们在实现中采用延迟载入的思想,且依然动态构建kd-tree,算法步骤如下:当光线进入某个node时,检查是否已分割过(分割指将node中景

24、物按分割平面分类,建立children nodes的过程),若未分割过,则按照未经细分的几何体(称为top-level geometry,如NURBS,Subdivision Surfaces等,这种几何表示方式的好处是非常节省储存空间)的包围盒分割,直至满足分割终止条件,建立leaf node,若leaf node中只有可以直接快速光线追踪的基本图元,比如polygons或triangles等,则光线直接与这些图元求交,若leaf node中包含更复杂的top-level geometry,则需要进一步细分为基本图元,比如microgrid等,然后再光线追踪(因为大量研究指出细分后再追踪依然

25、优于直接光线追踪,不只是速度上,还有对于软件体系结构的设计和维护等方面更有利),这种leaf node称为expanding leaf node。这时,我们根据光线的ray differentials,决定所需的细分层次level n,并依次生成一系列从level 0到level n的细分拷贝,我们可以用增量法避免重复计算,这要求细分与分割交替进行,比如对于level 0我们直接用expanding leaf node中的景物对应的microgrid拷贝(因为已满足分割终止条件),对于level 1,我们先细分level 0中的景物,再进一步按终止条件分割,同样,我们生成所有不同精度的expa

26、nding leaf node,并将它们储存再磁盘文件中,而只将风格平面的信息放在内存中(增量法还使高层次结点的分割平面的选择更快,因为此时只按细分较粗糙的microgrid选择分割平面,而不用在大量完全细分后的microgrid中选择),当光线进入expanding leaf node时,先按ray differentials选择一个细分层次,当光线进入某个sub-leaf node时,才载入相应的细分拷贝,并求交,expanding leaf node及其子结点均有一标记标明它们各自由哪个细分层次生成,若细分层次对于当前ray differentials不够精细,则同样用增量法补充生成细分

27、层次,并追加到磁盘文件中,这种改进后的kd-tree称为Multi-resolution kd-tree。5. Geometry InstancingGeometry Instancing使得我们在渲染成千上万个相同物体的实例时只需要大约一个该物体的内存用量,我们依然获取每个物体的包围盒,按照包围盒分割并构造kd-tree(因为一个包围盒的数据量几乎和一个三角形的数据量一样多,所以,为每个三角形储存其包围盒并不能减少多少内存用量,但总比没节省的好),因为在不同方位的实例,其shading结果也不相同,所以应在top-level geometry中储存与实例数目相同的多份irradiance c

28、ache拷贝,分别对应于不同实例,但这样又会导致irradiance cache所需的内存量过大。该方法的主要创新之处有:1. 不使用紧缩的Bounding Box,而直接在建立leaf时利用结点的包围盒对三角形进行裁剪(虽然更复杂,但是毕竟只进行一次)。2. 运用了两遍法使得GPIT(Geometric Primitive Indexing Table)连续顺序储存的实现成为可能。3. 使用GPIT,并将光线变换回景物局部空间求交。对Motion Blur,先按shutter open和shutter close的矩阵变换光线,再对所得光线本身插值。6. Ray-tracing Of Arb

29、itrary Geometry为了光线追踪任意的几何体(假设是该几何体总能转换为micropolygon,最终转换为triangles或motion triangles,因为我们选择kd-tree作为光线追踪核心的加速结构,因此这里的讨论均是针对kd-tree的),我们不可能预先细分生成足够精度的三角形逼近,随后再建立kd-tree,并进行光线追踪,因为在高质量渲染中,完全细分产生的三角形数量往往过于巨大而难以直接处理,所以我们需要一个动态的光线追踪框架,它能够根据当前光线指定的精度要求(通过ray differentials计算),动态的改变几何体的细节等级,即动态的改变所生成的三角形的数量

30、和形状,而这又导致kd-tree的结构必须做出相应的调整,并且我们应当适当的控制内存使用量,既不能使用过分多的内存,也不能每次都重新细分(Retessellation)几何体,导致大量的计算,这就要求我们有适当的caching策略。最好的情况就是可以将内存用量限制在一定的范围,而在此范围中,可以渲染无限制大小的场景,并且将渲染时间最大化,为了实现这一点,我们有一个全局的geometry cache,当渲染中需要申请新的内存块,而内存用量又超出用户预设的限制时,我们则通过Least Recently Used(LRU)算法,踢掉旧的内存块,而让新的几何体使用这块内存。很明显,这要求我们将算法中动

31、态生成的几何体,作为cache的一部分,可以按需求删除和重建,假设我们已经有了这样一套cache系统(我们的确有),现在来考虑要对系统做什么改变,并引入了什么新算法。我们将首先描述GPIT算法时如何实现Geometry Instancing的,随后针对动态光线追踪对其进行扩展。GPIT是Geometric Primitive Indexing Table的缩写,作为一张表,其最显著的特点就是它在内存中确实是一张连续存放的表,即它是一块连续的内存块,这样很明显的好处就是访问起来更加高效,而且只需要为每个带有GPIT的结点分配一次内存,而不像很多实现中一样,需要多次分配,这明显提高了光线追踪的效率

32、。GPIT中并不储存真正的几何数据,而是连续储存表示几何数据相对于基地址的索引值,和基地址本身。这样虽然增加了一次间接寻址,比直接储存几何数据访问起来慢一些,但是因为GPIT本身比较小,很可能完全位于CPU的高速缓存中,而且其中储存了下一个几何体的位置,所以总能通过CPU的预取指令提前预取下一个几何数据,提高缓存命中率,进而提高几何数据的访问速度。GPIT正是通过储存几何数据的索引值来轻松的实现Geometry Instancing,在光线追踪过程中,我们遍历GPIT,通过间接寻址访问几何数据,每次遇到一个新的物体实例(Object Instance),我们都将光线按照物体实例的camera

33、to object矩阵变换到物体的局部坐标系,如果物体实例有transform motion blur,即有通过对物体实例的空间变换产生的运动模糊,则我们可以先对camera to object矩阵与motion camera to object矩阵按照光线所对应的时间进行插值,然后再变换光线。但由于对矩阵本身进行插值比较复杂,需要分解矩阵为不同的变换部分,按各自的特点分别进行不同类型的插值,再组合起来,而对矩阵做简单的线性插值又会产生扭曲的结果,所以我们可以先分别按照这两个矩阵对光线进行变换,再对得到的两条光线按照时间插值,获得局部坐标系中的光线后,即可与GPIT中索引值所指的几何数据进行求

34、交,这样,无论一个物体有多少个物体实例,只需要储存多个GPIT,而不需要储存多个真实的几何数据,而GPIT本身相对较小,所以这极大的节省了内存。下面我们讨论如何扩展GPIT(eXtended GPIT,简称XGPIT),使之能够处理动态光线追踪。XGPIT及相关数据结构如图所示:MTGP是Multiresolution Tessellated Geometric Primitives的缩写,每个primitive对应一个MTGP,其中包含了该primitive各个细节层次的镶嵌表示。需要保证MTGP中每次Retessellation后生成的三角形顺序均与之前的顺序相同。可以考虑增量式细分,即后

35、一层次的细分表示在前一层次的细分表示的基础上生成,只计算并储存那些新加入的顶点。(1) 生成在相应结点包围盒内的sub-GPIT。(2) 为了加速,可以将静态的triangles和motion triangles合并到sub-GPIT中。(3) 将sub-GPIT放入对应的kd-tree结点中分割,建立sub-tree。(4) 各个primitive相互独立的细分,生成各自对应的MTGP。RT时,对动态部分进行两步查找,先按patch ID找到patch,然后在patch中按当前光线的ray differentials决定的细分层次寻找相应的sub-triangle ID指示的三角,与之求交,

36、这里去掉了指针的概念,因为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写的建立与遍历代码。现在的光线追踪过程为,首先,primitives得到其包围盒,因此primitive需要一个抽象的Bound操作,随后按照primitives的

38、包围盒建立kd-tree的静态部分,直到所有primitives都被放入leaf node指向的GPIT或XGPIT中(若不存在需要动态光线追踪的高级几何体,则XGPIT退化为GPIT,这个性质保证了中小规模的渲染速度不受影响),对于XGPIT,每次追踪光线时,判断sub-tree是否已建立,若已建立,则按ray differentials与Edge Length比较结果来选择合适的细分层次,若相应的node未建立,则遍历primitives,调用其抽象操作,Tessellate(int level),生成相应层次的细分后三角形(这样设计具有灵活性,因为primitive之间相互独立细分,便于

39、并行,但是具体的细分方法却没有限制,而且与kd-tree的具体结构无关,所以可以使用任何可能的细分方法。并且primitive未必就是数学表示上的单块patch,可以根据performance选择多块patch甚至整个surface作为primitive来一起细分,所以究竟以什么作为细分操作的基本单位可以灵活的选择),将这些三角形与leaf node的包围盒做测试,将位于该包围盒中的三角形加入sub-GPIT中,建立起sub-GPIT,并将leaf node中的静态部分合并进去,然后使用通常的kd-tree建立方法生成sub-tree,并让XGPIT中相应层次的node指针指向该sub-tre

40、e,若sub-tree未建立,则估算所有可能层次的Edge Length并写入XGPIT中(可以通过包围盒大小估算,也可以做试探性的细分,进行更精确的估算),之后按已建立sub-tree的情况处理。总结回顾前面提到的mental ray的一些缺点,我们逐一考察新算法框架是否能够解决这些问题:1. 新方法分开了hiding和shading过程,分解了各种特效的控制参数(主要是shading rate),故各种特效增加的渲染时间不再与象素数目有关,并且它们可以各自单独控制,增大反走样并不增加反射/折射。2. 新方法统一了多种算法,用同一个框架实现各种光线类型的优化,清晰且易于维护,由于通常只使用e

41、ye geometry cache,所以Reyes渲染器的用户可以很容易的让他们的经验派上用场,对渲染时间、内存用量与渲染结果的预测更加容易。3. 由于允许在各种shader中运用Russian Roulette(而不仅是Photon Shader),所以渲染时间与反射/折射层次数的关系由指数降为线性。4. 各种效果由各自的参数独立控制,开启多种效果的时间复杂度可以简单表示为各种效果的时间复杂度的线性组合。5. 分解各种特效的控制参数虽然增多了参数数目,但不同类型光线的对应参数的意义都是相同的,且十分直观而易于调整,不但提高了渲染速度,还提高了制作效率。总之,我个人认为elvish ray新算法框架在理论上可行,关键就是期待其实现了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号