Arnold嵌套介质 Nested Dielectrics 多重透明物体渲染方式

在现实世界中,当光到达两种介质(即透明)介质之间的边界时,它会折射和反射,而这两种介质的折射率不同, 例如,在以下液体玻璃中,光在空气、玻璃、液体和冰之间的不同边界处折射。
介质优先级:玻璃:3,冰和气泡:2,液体:1。
介质 _ 优先级:0 ,物理上不正确
PS:本文仅适用于最新版 Arnold(核心 6.1.0 版,即 C4DtaA 3.2.0 版以上)
在渲染器中创建这样的场景,通常是将玻璃和水建模为闭合网格(填充常量 IOR 材质)来完成的,这些网格要么是齐平的,要么是相交的,要么是具有气隙的。或者在某些渲染器中,必须显式地为 IOR 更改的每个接口建模,并在每侧标记 IOR,像这样手动将场景分解成独立的接口,IOR 会跳转将非常不方便。同样,将几何图形建模为齐平或气隙会产生各种问题。
所以在 Arnold(和许多其他渲染器)中采用的方法是使用嵌套介质(Nested Dielectrics),这意味着通过使电介质对象重叠来对场景进行建模,并在它们重叠的空间区域中,通过优先级系统,将材质解析为重叠的介电体之一。这可以正确跟踪 IOR 在光线折射时如何变化,从而导致逼真的渲染。
如果需要恢复到传统模式(则无法正确计算折射),则可以禁用全局介质优先级分辨率系统和物理校正 IOR 追踪选项。(在"渲染设置" - "高级"选项卡中 - 可找到"嵌套介质")。
为什么需要优先级
一杯水的例子
为了搞清楚这些概念,我们以一杯水为例,这包括四种透明介质(即玻璃、水、冰和周围的空气),它们都是由折射率(或 IOR)定义的介质。当然,场景中可能存在其他非介质,例如玻璃所在的金属桌。
在介质之间的边界处,当光线通过接口透射时,IOR 通常需要从一个值跳到另一个值,在渲染该对象时,光线在每个介质边界上反射或透射,每个表面上的菲尼尔因子和折射方向由边界两侧的 IOR 比率确定。
那么我们如何在渲染器中设置它呢?首先,阿诺德没有使用的两种方法进行比较。
显式 IOR 跳转(错误)
上面提到的一种方法是,显式地为各种接口建模,为每个接口指定外部和内部的 IOR(如下所示)。这将涉及到将对象分解为每个接口的单独网格,或以某种方式标记面。虽然这是一些渲染器所采用的正确方法,但对于艺术家来说,必须这样做显然非常不方便,尤其是复杂的几何体或动画时。
空气间隙或齐平接口(错误)
另一种方法是使用定义明确的 IOR 对闭合网格进行建模,并在它们之间放置空气间隙,以便它们不会接触或重叠,如下所示。这可能比通过接口分解模型更方便,但是不幸的是,由于它会在气隙中产生相互反射,因此在物理上并不正确。另一个不好的方法是将曲面精确地建模为齐平,这会引入数值不精确性问题。
Arnold 嵌套电介质
Arnold 采用的方法,也被许多其他渲染器使用,是基于 2002 年 Schmidt&Budge 的论文"光线跟踪图像中的简单嵌套介质"。在他们的方法(通常被称为嵌套介质)中,介质被建模为允许重叠的闭合曲面,但是我们必须通过分配优先级,来指定给定区域中存在哪些重叠曲面,也就是说,我们给每个介质分配一个整数优先级,然后在一个重叠区域中,最高优先级介质是假定存在的唯一介质,如下图所示。(请注意,空气没有优先权,因为我们可以将其视为没有介质)。光线在场景中反弹回来,在优先级分辨率之后,在幸存的界面上正确反射和折射,并且随着光线的传播,介质的 IOR 被正确“跟踪”了。
现在这是物理上正确的,并且相对容易设置。请注意,这意味着,例如,玻璃内部的水代理网格的边界是“非活动”的,在这个意义上没有实际的IOR跳转跨越该边界。Schmidt&Budge将这些边界称为“假接口”。这些低优先级的假接口实际上被有效的切掉了,类似于布尔操作。在这些界面上没有阴影发生,光只是通过它们而没有相互作用。光只在没有被切断的真实界面上反射和透射。
介质优先级
在Arnold中,介质(玻璃、水等)是通过标准着色器(Standard_Surface)创建的,该着色器主要是在透射选项下指定的,不过请注意,介质的IOR是由镜面IOR参数指定的。因此,优先级自然是标准着色器(Standard_Surface)的参数,即Dielectric Priority。如上所述,当介质对象重叠时,优先级较高的对象覆盖优先级较低的对象。然后在给定空间区域中幸存的最高优先级介质指定该区域的介电特性(即IOR和体积散射特性)。
介质优先级(在标准着色器 透射选项中可找到)是一个整数(默认为0),可以是正的也可以是负的,优先级越高优先级越低。例如,如果优先级为2的玻璃与优先级为1的水重叠,则在重叠区域中,只有玻璃存活。也允许负优先级,因此,例如,优先级为0的对象将覆盖优先级-1(因为有时使用负优先级来指定优先级低于默认值0的介质可能比较方便)。
PS:在其他一些渲染器中,数字越小,意味着优先级越高。我们认为这是不必要的混淆,因此更高的数字对应于更高的优先级,这会覆盖较低的数字。
优先权的最基本效果,来通过这些具有内部散射介质的重叠玻璃球来了解下:
注意,对于具有内部吸收或散射介质的介质,需要设置透射深度。例如,请参阅下面的橙汁示例。
如果优先级相同在介质重叠,则其内部属性会合并,即IOR平均值和内部体积介质混合(因此,如果两个具有相同优先级的等效介质重叠,则它们有效地被合并)。
有一个全局开关可以禁用嵌套介质,称为介质优先级。介质优先权禁用可以读作“无优先权”。在这种情况下,表面永远不会被移除,并且表面忽略了可能嵌入其中的任何周围介质,将外部视为真空。这是一种非物理模式(传统模式),它在引入IOR跟踪之前保留场景的外观,并且与启用跟踪相比,渲染速度可能更快。
对于一杯威士忌,我们将威士忌网格展开以覆盖周围的玻璃,并赋予威士忌比玻璃杯更低的优先级。酒杯内的威士忌边界仅起到“代理”网格的作用,表示存在优先级较低的威士忌。我们给威士忌的优先级也比冰低,所以冰取代了威士忌。例如,对于显示的优先级,这将定义空间中每个点的正确IOR。
液体(1)比冰和气泡(2)具有更低的介电优先级。玻璃(3)具有最高优先级。
指定介质
如前所述,低优先级的"假"接口被切断,光有效地不受干扰地通过它们。因此,任何着色参数(如粗糙度)仅在实际界面上有效。但是,并非所有的着色参数在假界面上都会被完全忽略–当光线进入介质时,定义介质内部的着色器参数仍会被考虑在内(因为标准着色器还允许指定"嵌入"在介质中的内部散射介质)。具体如下:
确定嵌套电介质内部特性的标准表面着色器参数为:
镜面反射IOR Specular_IOR
透射颜色 Transmission_Color
透射深度 Transmission_Depth
透射散射 Transmission_Scatter
透射散射各向异性 Transmission_scatter_Anisotropy
透射色散 Transmission_Dispersion
在上面的例子中,在水上设置这些参数意味着水的内部将被分配这些属性,即使玻璃内部的水界面是假的。
例如,如果要渲染一杯橙汁(请参见下面的示例),与玻璃网格重叠的液体网格优先级较低,但必须将"透射颜色 Transmission_Color"和"透射深度 Transmission_Depth"设置为橙色,以便指定"主体"果汁内部的比尔定律(Beer's Law)吸收为橙色(还可以加上一些可选的透射散射 Transmission_Scatter):
添加到分配给橙汁几何体的标准着色器的透射散射效果(介质优先级:1)
当透射深度为零(默认值)时,透射颜色仅起表面着色的作用,当它出现在与玻璃重叠的液体边界上时,会被忽略,导致果汁清澈。
如果希望介质具有内部吸收/散射(例如橙汁、葡萄酒、蜂蜜、浑水等),请确保将“透射深度”设置为非零值。
但是请注意,任何纯粹的表面特性,如粗糙度(纹理或常量),只有在应用于优先后,保留的实际边界时才会生效。
如果应用于低优先级对象的假接口,则不控制介质内部特性的标准着色器的参数将被忽略。例如,在一杯橙汁的例子中,如果我们设置透射深度(默认值0),那么透射颜色只起到表面着色的作用,当它出现在玻璃杯内果汁的假边界上时,就会在果汁的内部"主体"中被忽略,从而导致错误的外观:
左:透射深度0,果汁较清澈;右:透射深度4,果汁渲染正确
气泡渲染
气泡(例如在玻璃中)的渲染应通过赋予气泡几何体,比玻璃和气泡内部IOR更高的优先级来实现(例如,对于空气,镜面IOR=1.0)。在下面的示例中,已为"玻璃:1.5"和"气泡:1"正确设置了"镜面反射"。对于玻璃,介质优先级设置为1,对于气泡,设置为2。
介质优先级:玻璃1,气泡2
玻璃或水里的气泡是超亮的,因为它们周围有一圈全内反射(TIR),具有完美的反射。
当渲染玻璃内的气泡时,只有在不使用嵌套电介质(即禁用电介质优先级)时,翻转法线以用真空填充气泡的旧技巧才有效。
光线深度
在复杂几何体中渲染真实反射和折射可能需要较高的光线深度,因为可能会出现大量内部反射。
确保镜面反射/透射/总光线深度足够高,否则,液体/玻璃可能看起来很暗。
镜面光线深度1
镜面光线深度5
镜面光线深度1
镜面光线深度5
请注意,增加"镜面光线深度"会显著增加渲染时间。