|
如何正确渲染一杯冰水?在现实世界中,当光入射到具有不同折射率(IOR)的两种介电(即透明)介质之间的边界时,光会发生折射和反射。例如,在下面的液体玻璃中,光在空气,玻璃,液体和冰之间的各个边界处折射。 电介质优先级:玻璃:3,冰和气泡:2,液体:1。 通常在渲染器中创建这样的场景是通过将玻璃和水建模为闭合的网格(填充有恒定的IOR材料)来实现的,这些网格是齐平的,相交的或具有气隙。或在某些渲染器中,必须显式地对IOR更改的每个接口进行建模,并在每侧标记IOR。像这样手动将场景分解成单独的界面,IOR会跳转,这非常不方便。同样,将几何图形建模为齐平或气隙会产生各种伪像。 为什么需要优先考虑杯水的例子为了阐明这些概念,我们以一杯水为例。这涉及四种透明介质(即玻璃,水,冰和周围的空气),它们都是由折射率(或IOR)定义的电介质。当然,场景中可能还存在其他非电介质,例如玻璃所在的金属桌子。 在介电介质之间的边界处,随着光线通过界面传输,IOR通常会从一个值跳到另一个值。在渲染该对象时,射线在每个介电边界反射或透射,并且每个表面的菲涅耳因数和折射方向由边界每一侧的IOR的比率确定。 那么我们如何在渲染器中进行设置呢?首先,比较一下Arnold不使用的几种方法。 明确的IOR跳跃(错误做法)如上所述,一种方法是显式地对各种接口进行建模,并为外部和内部的每个IOR指定IOR(如下所示)。这将涉及将对象分成每个接口的单独网格,或以某种方式标记面。尽管这是某些渲染器采用的正确方法,但对于艺术家而言,这样做显然很不方便,尤其是在几何形状复杂和/或具有动画效果的情况下。 空气间隙或交叉重叠(错误做法)另一种方法是使用定义明确的IOR为封闭的网格建模,并在它们之间放置空隙,以使它们不会接触或重叠,如下所示。这可能比通过接口分解模型更方便,但是不幸的是,由于它在气隙中产生相互反射,因此在物理上并不正确。另一个不好的方法是将曲面建模为完全平齐,这会引入数值不精确性问题。 阿诺德方法–嵌套电介质Arnold所采用的方法也被许多其他渲染器使用,该方法基于Schmidt&Budge于2002年发表的论文“光线跟踪图像中的简单嵌套介电体”。在他们的方法(通常称为嵌套电介质)中,将电介质建模为允许重叠的闭合表面,但是我们必须通过分配优先级来指定给定区域中存在哪些重叠表面。也就是说,我们给每个介电介质分配了一个整数优先级,然后在重叠区域中,最高优先级介质是唯一存在的介质,如下图所示。(请注意,空气没有优先级,因为我们可以将其视为没有介质)。优先级解析后,光线从场景中反射并在幸存的界面上正确反射和折射,并且随着光线的传播,介质的IOR被正确“跟踪”了。 现在这在物理上是正确的,并且相对容易设置。请注意,这意味着,例如,在玻璃内的水代理网格的边界在没有实际IOR跨越该边界的意义上是“非活动的”。Schmidt&Budge将这些边界称为“虚假接口”。这些低优先级错误接口有效地被切除,类似于布尔运算。在这些界面上没有阴影发生,光只是简单地通过它们而没有相互作用。光仅在不被切除的真实界面处反射和透射。 介电优先在Arnold中,介电介质(玻璃,水等)是通过standard_surface 着色器创建的,主要在传输中指定,尽管请注意,介电的IOR由specular_IOR参数指定。因此,优先级自然是standard_surface着色器的参数,即medium_priority。如上所述,当电介质对象重叠时,优先级较高的对象优先于优先级较低的对象。然后,在给定的空间区域中存活的最高优先级介质将指定该区域中的介电特性(即IOR以及体积散射特性)。 medium_priority(在standard_surface的传输下找到)是一个整数(默认值为0),可以为正或负,其中较高的优先级数字将覆盖较低的优先级。因此,例如,如果优先级为2的玻璃与优先级为1的水重叠,则在重叠区域中,只有玻璃可以幸存。允许使用负优先级,因此,例如,优先级为0的对象将优先于优先级-1 (因为使用负优先级有时可以指定比默认优先级0低的优先级介质,这很方便。 其他一些渲染器的数量越少,意味着优先级越高。我们认为这不必要地造成混淆,因此,较高的数字对应较高的优先级,而优先级会覆盖较低的数字。 这些重叠的玻璃球与内部散射介质说明了优先级的最基本效果:
蓝色 1 黄色 1 蓝色 2 黄色 1 蓝色 1 黄色 2 请注意,对于具有内部吸收或散射介质的电介质,需要设置传输深度。例如,请参见下面的橙汁示例。 如果优先级相同的电介质重叠,则它们的内部属性会合并,即IOR平均值和内部体积介质会混合(因此,如果两个优先级相同的等效电介质重叠,则它们实际上会合并)。 有一个全局开关可以禁用嵌套的电介质,称为电介质优先级。禁用介电优先级可以读作“无优先级”。在这种情况下,表面永远不会被移除,并且该表面会忽略可能嵌入该表面的任何周围电介质,从而将外部视为真空。此功能用作非物理模式(旧版),可在引入IOR跟踪之前保留场景外观,并且比启用跟踪时渲染速度更快。 medium_priorities:已禁用 在一杯威士忌的情况下,我们将威士忌滤网扩展为与周围的玻璃重叠,从而使威士忌的优先级低于玻璃。然后,玻璃杯中的威士忌酒边界仅充当“代理”网格,表明存在优先级较低的威士忌酒。我们还把威士忌酒的优先权放在冰上,因此冰代替了威士忌。例如,根据所示的优先级,这定义了空间中每个点的正确IOR。
玻璃优先级最高为3 , 其次是冰块为2 ,最后是水为1。 指定电介质如前所述,低优先级的“虚假”接口被切除,光线有效地不受干扰地通过它们。因此,任何阴影参数(例如粗糙度)仅在实际界面上生效。但是,并非所有的着色参数在虚假界面上都被完全忽略-当光线进入介电介质时,仍会考虑定义介电介质内部的着色器参数(因为standard_surface着色器还允许指定内部散射介质“嵌入”)。这些是以下内容:
已将transmission_scatter添加到分配给橙汁几何体的standard_surface(介质优先级:1) 当transmission_depth为零 (默认值)时, transmission_color 仅用作表面色调,因为它出现在与玻璃重叠的液体边界上,因此会产生透明的汁液。 如果您希望电介质具有内部吸收/散射(例如,橙汁,葡萄酒,蜂蜜,浑浊的水等),请确保将transmission_depth设置为非零值。 但是请注意,任何纯表面属性(例如粗糙度(纹理或常数))仅在应用于优先分辨率后仍保留的真实边界时才会生效。 所述的参数standard_surface其不着色器不 控制所述电介质的内部属性将被忽略 ,如果施加到低优先级的对象的假接口。例如,在一杯橙汁示例中,如果我们将传输深度设置为零(默认值),则transmission_color仅用作表面色度,因为它会出现在玻璃杯中果汁的假边界上,因此在果汁的内部“散装”导致外观不正确:
transmission_depth:0(默认)产生透明汁 / transmission_depth:4 果汁呈现正确 气泡渲染渲染的气泡(在玻璃,说)应通过给泡沫的几何形状来实现一个更高的优先级比玻璃和气泡内部的IOR(例如specular_IOR = 1.0,为空气)。在下面的例子,specular_IOR已正确设置两个玻璃:1.5,气泡:1.该dielectric_priority被设定为1的玻璃,和2的气泡。 medium_priority:玻璃:1,气泡:2。 玻璃或水中的气泡超亮,因为它们周围的全内反射(TIR)环具有完美的反射效果。 当渲染气泡内部玻璃翻转所述法线与真空以填充气泡的旧特技仅不使用嵌套的电介质的情况下,即,如果工作dielectric_priorities被禁用。 射线深度由于可能发生大量内部反射,因此在复杂的几何图形中渲染逼真的反射和折射可能需要较高的射线深度。 确保镜面/透射/总光线深度足够高,否则,液体/玻璃可能看起来很暗。
specular_ray_depth : 1(默认值),看起来很暗 请注意,增加specular_ray_depth可能会大大增加渲染时间。 本文源自 Arnold官方解决方案 上一篇亮片材质解决方案 |