嵌套电介质:使用嵌套电介质在玻璃中进行渲染。

dielectric_priority玻璃为 1,气泡为 2(正确)。变换图像显示玻璃和气泡都为 0(默认值)时的效果(物理上不正确)。

有关如何在 Arnold 中渲染气泡嵌套电介质的视频教程,请单击此处

 

在现实世界中,当光线照射到具有不同折射率 (IOR) 的两种电介质(即透明介质)之间的边界处时,光线会发生折射和反射。例如,在下面的液体玻璃中,光线在空气、玻璃、液体和冰之间的不同边界处发生折射。

 

dielectric_priority玻璃:3,冰和气泡:2,液体:1。

变换图像显示 dielectric_priority 为 0 时的效果(物理上不正确)。

 

在渲染器中创建这样一个场景通常是通过将玻璃和水建模为闭合网格(使用恒定 IOR 材质填充)来实现的,这些网格是齐平的、相交的或具有气隙的。或者,在某些渲染器中,必须显式地对 IOR 发生更改的每个界面进行建模,并在每一侧标记 IOR。像这样手动将场景分解成 IOR 跃迁的不同界面是非常不方便的。此外,将几何体建模为齐平的或具有气隙的会产生各种瑕疵。

 

因此,在 Arnold(和许多其他渲染器)中采用的方法是使用嵌套电介质,这意味着通过使电介质对象重叠来对场景进行建模,并且在它们重叠的空间区域中,通过优先级系统将材质解析为重叠的电介质之一。这正确地跟踪了光线折射时 IOR 的变化,从而实现真实的渲染。

如果需要恢复到旧版模式(无法正确计算折射),则可以使用 options.dielectric_priorities(渲染设置的“高级”(Advanced)选项卡中的“嵌套电介质”(Nested Dielectrics))全局禁用电介质优先级解析系统和物理上正确的 IOR 跟踪。

为什么需要优先级

水杯示例

为了澄清这些概念,我们以一杯水为例。这包括四种透明介质(即玻璃、水、冰和周围空气),它们都是由折射率 (IOR) 定义的电介质。当然,场景中可能存在其他非电介质,例如放置玻璃杯的金属桌子。

 

在电介质之间的边界处,当光线透射过界面时,IOR 通常会从一个值跃迁到另一个值。在渲染该对象时,光线在每个电介质边界处反射或透射,并且每个曲面的菲涅尔因子和折射方向由边界两侧的 IOR 比率确定。

如何在渲染器中设置它?首先,比较一下 Arnold 不使用的几种方法。

显式 IOR 跃迁 (error)

如上所述,一种方法是显式地对各种界面进行建模,为每个界面指定内侧和外侧的 IOR(如下所述)。这将涉及针对每个界面将对象分解为不同的网格,或以某种方式标记面。虽然这是一些渲染器采用的正确方法,但对于艺术家来说,这样做显然非常不方便,尤其是当几何体很复杂且/或已设置动画时。

气隙或齐平界面 (error)

另一种方法是使用定义明确的 IOR 对闭合网格进行建模,并在它们之间放置气隙,以便它们不接触或重叠,如下所示。这可能比按界面分解模型稍微方便一些,但遗憾的是,这在物理上不正确,因为它在气隙中会产生相互反射。另一种不好的方法是,将曲面建模为完全齐平,这会引入数值不精确问题。

Arnold 的方法 - 嵌套电介质 (tick)

Arnold 所采用的方法也被许多其他渲染器使用,该方法基于 Schmidt 和 Budge 于 2002 年发表的论文“Simple Nested Dielectrics in Ray Traced Images”(光线跟踪图像中的简单嵌套电介质)。在他们的方法(通常称为嵌套电介质)中,电介质建模为允许重叠的闭合曲面,但随后我们必须通过指定优先级来指定给定区域中存在哪些重叠的曲面。也就是说,我们为每个电介质指定一个整数优先级,然后在重叠区域中,最高优先级介质是唯一假设存在的介质,如下图所示。(请注意,空气没有优先级,因为我们可以将其视为没有介质)。在优先级解析后,光线从场景中反射回来,并在存留的界面上正确反射和折射,随着光线的传播,会正确“跟踪”介质的 IOR。

这在物理上是正确的,并且相对容易设置。请注意,这意味着,例如,玻璃内水代理网格的边界处于“非活动”状态,从某种意义上说,该边界上没有实际的 IOR 跃迁。Schmidt 和 Budge 将这些边界称为“虚假界面”。与布尔运算类似,这些低优先级的虚假界面实际上被切除。在这些界面上不会进行着色,光线只是通过它们而没有相互作用。光线仅在未切除的真实界面上反射和透射。

电介质优先级

在 Arnold 中,电介质(玻璃、水等)是通过 standard_surface 着色器(主要在“透射”(Transmission)下指定)创建的,但请注意,电介质的 IOR 由 specular_IOR 参数指定。因此,优先级自然是 standard_surface 着色器的一个参数,即 dielectric_priority。如上所述,当电介质对象重叠时,优先级较高的对象覆盖优先级较低的对象。给定空间区域中优先级最高的介质存留下来,然后在该区域中指定电介质特性(即 IOR 和体积散射特性)。

dielectric_priority(位于 standard_surface 的“透射”(transmission)下)是一个整数(默认值为 0),该整数可以是正值或负值,其中较高的优先级数值覆盖较低的优先级数值。 例如,如果优先级为 2 的玻璃与优先级为 1 的水重叠,则在重叠区域中,只有玻璃会存留下来。允许使用负优先级,例如,优先级为 0 的对象将覆盖优先级为 -1 的对象(因为有时使用负优先级指定优先级低于默认值 0 的介质可能很方便)。

其他一些渲染器使用较低的数值来表示较高的优先级。我们认为这会造成不必要的混淆,因此,我们使用较高的数值对应较高的优先级,用较高的数值覆盖较低的数值。

 

以下具有内部散射介质的重叠玻璃球体说明了优先级的最基本效果:

请注意,对于具有内部吸收或散射介质的电介质来说,需要设置 transmission_depth。例如,请参见下面的橙汁示例。

如果同等优先级的电介质重叠,则它们的内部特性会合并,即 IOR 求平均值,并且内部体积介质会混合(因此,如果具有同等优先级的两个等效电介质重叠,则它们实际上会合并)。

有一个名为 dielectric_priorities 的全局开关,可禁用嵌套电介质。禁用电介质优先级可以理解为“无优先级”。在这种情况下,曲面永远不会被移除,曲面会忽略可能嵌入该表面的任何周围电介质,将外部视为真空。这可以用作非物理模式(旧版),可在引入 IOR 跟踪之前保留场景的外观,而且比启用跟踪时渲染速度更快。

dielectric_priorities禁用

 

如果是一杯威士忌,我们扩展威士忌网格以便与周围的玻璃重叠,并赋予威士忌低于玻璃的优先级。然后,玻璃内的威士忌边界将仅用作“代理”网格,这表示存在较低优先级的威士忌。我们还赋予威士忌低于冰的优先级,所以冰取代了威士忌。例如,根据所显示的优先级,这定义了空间中的每个点处的正确 IOR。

液体 (1)dielectric_priority 低于冰和气泡 (2)玻璃 (3) 具有最高的优先级。

 

指定电介质

如前所述,低优先级的“虚假”界面被切除,实际上光线不受干扰地通过它们。因此,任何着色参数(例如粗糙度)仅在真实界面中生效。但是,并非所有的着色参数在虚假界面上都被完全忽略 - 当光线进入电介质时,仍会考虑那些定义电介质内部的着色器参数(因为 standard_surface 着色器还允许指定“嵌入”到电介质中的内部散射介质)。这些着色器参数如下所示:

可用于确定嵌套电介质的内部特性的 standard_surface 着色器参数包括:

  • specular_IOR
  • transmission_color
  • transmission_depth
  • transmission_scatter
  • transmission_scatter_anisotropy
  • transmission_dispersion

在上述示例中,对水设置这些参数意味着将为水的内部指定这些特性,即使玻璃内部的水界面为虚假界面也是如此。


例如,如果要渲染一杯橙汁(参见下面的示例),与玻璃网格重叠的液体网格是低优先级,但需要将 transmission_color 设置为橙色,并设置 transmission_depth 以指定大部分果汁内部的比尔定律吸收是橙色(加上一些可选的 transmission_scatter):

transmission_scatter 已添加到指定给橙汁几何体的 standard_surfacedielectric_priority:1)

如果 transmission_depth 为零(默认值),则 transmission_color 仅用作曲面染色,由于它出现在与玻璃重叠的液体边界上,因此会被忽略,从而产生清澈的果汁。

如果希望电介质具有内部吸收/散射(例如橙汁、酒、蜂蜜、浑浊的水等),请确保将 transmission_depth 设置为非零值。

但请注意,任何纯曲面特性,例如粗糙度(带纹理或常量),仅在应用于在优先级解析后仍保留的真实边界时才生效。

对于那些不控制电介质内部特性的 standard_surface 着色器参数,在应用于低优先级对象的虚假界面时,将被忽略。 例如,在一杯橙汁示例中,如果将 transmission_depth 设置为零(默认值),则 transmission_color 仅用作曲面染色,由于它出现在玻璃内部橙汁的虚假边界上,因此在大部分果汁内部会被忽略,从而产生不正确的外观:

 

气泡渲染

气泡的渲染(例如在玻璃中)应通过赋予气泡几何体高于玻璃的优先级并指定气泡内部 IOR(例如,对于空气,specular_IOR = 1.0)来实现。在下面的示例中,正确设置了 specular_IOR:玻璃为 1.5,气泡为 1。dielectric_priority 设置为 1(对于玻璃)2(对于气泡)


 

dielectric_priority玻璃为 1,气泡为 2。

玻璃或水中的气泡由于其周围的全内反射 (TIR) 环具有完美的反射效果,所以非常明亮。

渲染玻璃内的气泡时,仅当不使用嵌套电介质时(即禁用 dielectric_prorities 时),翻转法线以使用真空填充气泡的老方法才起作用。

 

光线深度

由于可能会发生大量内部反射,因此在复杂几何体中渲染真实反射和折射可能需要较高的光线深度。

请确保镜面反射/透射/总光线深度足够高,否则,液体/玻璃可能会显得较暗。

specular_ray_depth:1(默认值)。变换图像显示值为 5 时的效果。

请注意,增大 specular_ray_depth 会显著增加渲染时间。

  • No labels
Privacy settings / Do not sell my personal information / Privacy/Cookies