天空和太阳

简介

mental ray 物理太阳和天空着色器专为启用物理正确的日光模拟和精确的日光场景渲染而设计。

分析使用

该着色器库提供了一些用于照明分析的工具。还为标准 CIE 天空模型(晴天或阴天)提供一个着色器。该着色器为灰度(无颜色),用于分析,而非生成赏心悦目的图像。详细信息请参见 ciesky 页。mia_physicalsky 着色器支持 Perez 天空模型中与分析相关的参数,mia_physicalsun 支持显式照度参数。

概述

mia_physicalsunmia_physicalsky 往往一起使用,mia_physicalsun 着色器适用于表示太阳光的平行光mia_physicalsky 着色器用作场景的摄影机环境着色器。通过最终聚集(必须启用)可以将环境着色器用于照亮场景,通过最终聚集漫反射反弹或通过 GI(光子)可以处理太阳的反射光。

为了提高室内拍摄的质量,可以将天空与天空入口页上所述的 mia_portal_light 着色器结合使用。

单位

太阳和天空使用真正的光度单位,但通过 rgb_unit_conversion 参数可以将输出转化为其他单位。

如果将其设定为 1 1 1,则通过 mi_luminance 函数发送时,mental ray 着色器 API 函数 mi_sample_light(太阳光)和 mi_compute_avg_radiance(天光)返回的值可以视作光照度值,以勒克斯为单位。

由于大气外的太阳强度被校准为 5900 开氏度黑体辐射(提供 127500 勒克斯的照度),因此,与灯光强度通常为 0 到 1 的“传统”渲染相比,这是非常明亮的

rgb_unit_conversion 参数可以作为倍增应用,并设定为低于 1.0 的值(例如 0.001 0.001 0.001),以将原始勒克斯值转化为更易“度量”的单位。

为了方便起见,在内部设定 rgb_unit_conversion 特殊值 0 0 0,以使 80000 勒克斯(大约为晴天的光照量)等于传统光照水平 1.0。

一种有趣的替代方法是将 rgb_unit_conversion 设定为 0.318 0.318 0.318。然后,图像中的最终渲染像素(使用 mia_material 或遵循着色约定的着色器渲染时或通过 mi_luminance 函数发送时)是真正的光照度值,以每平方米烛光1为单位。

这些真正的亮度值完全适合作为色调映射器页中所述的摄影色调映射器的输入值,其 cm2_factor 设定为 1.0。

快速 SSS 和 SunSky 的重要说明

要结合使用 mental ray 快速 SSS 着色器以及高动态范围间接太阳光和天光,请务必启用 Indirect参数,以便 SSS 着色器散射天光(被认为间接光)。

同样请务必禁用 Screen composit参数(否则,SSS 着色器的输出将钳制为低动态范围且渲染黑色)。

公用参数

某些参数在 mia_physicalsunmia_physicalsky 上都存在,且都执行相同的操作。要保证物理正确性,太阳和天空中的这些参数彼此之间需要保持同步。例如,太阳的薄雾值不同于天空薄雾值时无法保证其物理真实性。

最重要的公用参数是那些控制整个着色模型和明暗模型的参数:

太阳参数

mia_physicalsun 负责太阳光的颜色和强度,以及从太阳发射光子。该着色器在平行光源上应该用作灯光着色器光子发射着色器(它不会处理任何其他灯光类型)。

declare shader "mia_physicalsun" (
        boolean "on"                   default on,
        scalar  "multiplier"           default 1.0,
        color   "rgb_unit_conversion"  default 0.0001 0.0001 0.0001,
        scalar  "haze"                 default 0.0,
        scalar  "redblueshift"         default 0.0,
        scalar  "saturation"           default 1.0,
        scalar  "horizon_height"       default 0.0,
        scalar  "shadow_softness"      default 1.0,
        integer "samples"              default 8,
        vector  "photon_bbox_min",
        vector  "photon_bbox_max",
        boolean "automatic_photon_energy",
        boolean "y_is_up",
        integer "illuminance_mode"           default 0,
        scalar  "direct_normal_illuminance"  default 0.0
    )
    version 6
    apply light
end declare

如上所述,mia_physicalsun 包含几个在 mia_physicalsky中也显示的常用参数(hazeredblueshift 等)。mia_physicalsun 中的这些参数的值应该与 mia_physicalsky 中的匹配。特定于 mia_physicalsun 的参数如下所示:

天空参数

mia_physicalsky 着色器负责创建表示大气天顶的颜色渐变,然后通过最终聚集和/或天空入口(请参见天空入口页)将其用于照亮场景。mia_physicalsky 用作环境着色器时,也向摄影机显示天空以及在反射中显示。

mia_physicalsky 还会在模型“下方”创建虚拟地平面。这使得不必始终以地平线为基准来实际对几何体建模 - 虚拟地平面提供这种地面的视觉效果和反弹光。

declare shader "mia_physicalsky" (
        boolean "on"                  default on,
        scalar  "multiplier"          default 1.0,
        color   "rgb_unit_conversion" default 0.0001 0.0001 0.0001,
        scalar  "haze"                default 0.0,
        scalar  "redblueshift"        default 0.0,
        scalar  "saturation"          default 1.0,
        scalar  "horizon_height"      default 0.0,
        scalar  "horizon_blur"        default 0.1,
        color   "ground_color"        default 0.2 0.2 0.2,
        color   "night_color"         default 0 0 0,
        vector  "sun_direction",
        light   "sun",   
        # The following parameters are only useful
        # when the shader is used as environment
        scalar  "sun_disk_intensity"  default 1.0,
        scalar  "sun_disk_scale"      default 4.0,
        scalar  "sun_glow_intensity"  default 1.0,
        boolean "use_background",
        shader  "background",
        # For the lens/volume shader mode
        scalar  "visibility_distance",
        boolean "y_is_up",
        integer "flags",
        integer "sky_luminance_mode" default 0,
        scalar  "zenith_luminance"               default 0.0,
        scalar  "diffuse_horizontal_illuminance" default 0.0,
        # Perez model luminance distribution parameters
        scalar  "a",
        scalar  "b",
        scalar  "c",
        scalar  "d",
        scalar  "e",
        boolean "physically_scaled_sun"
    )
    version 5
    apply environment, texture, lens, volume
end declare

请务必注意,mia_physicalsky 着色器以不同的方式处理光线。来自摄影机的直接光线以及反射和折射光线可看到“整个”效果,包括下面所述的“太阳表面”。但是,由于照明已经具有代表太阳的直接光(使用 mia_physicalsun 着色器),因此最终聚集射线看不到太阳表面3

这些参数不影响最终聚集结果,仅影响“可见”结果,即摄影机看到的内容以及反射和折射中看到的内容:

CIE 天空模型

CIE 天空模型是照明分析中使用的标准模型。它是无色(灰度)模型,因此不适用于创建产品级质量图像,但其优点是符合标准化(已知)的亮度分布。

declare shader "mia_ciesky" (
        boolean "on"                  default on,
        color   "rgb_unit_conversion" default 0.0001 0.0001 0.0001,
        # Luminance parameters
        boolean "auto_luminance"                 default on,
        scalar  "zenith_luminance"               default 0.0,
        scalar  "diffuse_horizontal_illuminance" default 0.0,
        # CIE specific parameters. 0 = clear sky, 1 = overcast
        scalar  "overcast"            default 0.0,
        # Sun direction
        vector  "sun_direction",
        light   "sun",   
        # Y vector
        boolean "y_is_up",
    )
    version 1
    apply environment, texture
end declare

该着色器与 mia_physicalsky 共享许多参数且这些参数的作用都相同,这包括 onrgb_unit_conversionsun_directiony_is_up 参数。详细信息请参见 mi_shader__mia_physicalsky 页。

以下参数是 mia_ciesky 着色器特有的:

天空和环境入口

问题

计算机图形中的典型问题是,通过间接灯光(如来自天空或来自获取的 HDRI 或类似对象中的其他“环境”光)单独为场景照明。

在 mental ray 中使用最终聚集(以下简称 FG)完成此操作,并通过跟踪大量“最终聚集射线”以查看照亮环境(或其他照明曲面)的光完成此操作。由于有大量光线数,结果将在最终聚集点进行缓存(改善性能)并对结果插值,从而“平滑”结果。

通过最终聚集射线“看到”大量非常均匀的灯光时,表示其正常工作。通常,场景中的灯光级别非常均匀时,最终聚集会提供最佳结果;其通过天空(大多数最终聚集射线“看到”天空)可以很好地照亮室外场景,并可以很好地反弹房间中的次要灯光,该房间中的大多数曲面由直接光照明(大多数最终聚集射线“看到”一些已照明的曲面)。

但是,以下场景更容易出现问题,房间黑暗没有任何灯光且只有一个朝向天空的窗:


在右侧图像中,几乎所有最终聚集射线都将“看到”黑色,只有少数射线可以从狭窄的窗中“逃出”而照亮天空。要准确解决此问题,需要发出很多最终聚集射线,这将对性能产生不利影响。

进一步的区别是,在前两个场景(室外场景和光线充足的室内场景)中已经存在造成高质量直接阴影的直接灯光,这解决了场景中的细节;最终聚集只用于其他反弹照明或天空照明,不提供批量照明。因此,有最终聚集点插值引起的任何“过度平滑”问题由其他光线盖过(或使用 mia_material 中的 AO 予以解决)。

但是最右侧的场景并不具有该优势,所有灯光都是间接的天光。因插值引起的任何过度平滑问题都清晰可见,这意味着同时需要高的最终聚集射线数高的最终聚集点密度以创建满意的渲染,从而提供更长的渲染时间。

许多用户进行内部渲染使用的常见技术是在窗中放置一个区域光,以提供天空照明,而不是依靠最终聚集“查找”天空。但是这样又引申出一个问题“该灯光的亮度和颜色应该如何?”

解决方法

要解决所有这些问题,需要引入入口光概念。入口光是放置在窗的(矩形)区域光,它从窗的天空中获得正确的强度和颜色(即,环境着色器,如 mia_physicalsky 或类似设备)以及可以“看到”的天空的大小4

实际上,这使得入口光相当于“最终聚集集线器”,因此,无需在场景周围发送数千个最终聚集射线以“查找”窗,入口光实际上阻止最终聚集射线,且将其从超出窗的光线转化为直接光,该直接光的高质量区域阴影不具有与插值相关的问题。

最终聚集将看到非常明亮的房间而非黑暗的房间,且能够以更低的最终聚集射线数执行。此外,由于来自窗的光现在是直接光,因此,可以“免费”获得一个附加的灯光反弹。

mia_portal_light

mia_portal_light 着色器在矩形区域光上应该同时用作灯光和光子发射器着色器。mental ray 灯光实例必须设定为可见(这是入口光可用于“阻止”最终聚集射线的技术要求。但是,灯光实际在渲染时否可见是由着色器处理的)。

此外,必须设定 mental ray 灯光实例,例如在灯光自身坐标空间的 X/Y 平面中扩展矩形区域光,且必须使用灯光实例的变换5处理灯光的任何变换。

存在以下参数:

declare shader "mia_portal_light" (
        boolean "on"                     default on,
        scalar  "multiplier"             default 1.0,
        color   "tint_color"             default 1 1 1,
        boolean "reverse"                default off,
        scalar  "cutoff_threshold"       default 0.005,
        boolean "shadows"                default true,
        boolean "use_custom_environment" default off,
        shader  "custom_environment",
        boolean "visible"                default off,
        boolean "lookup_using_fg_rays"   default on,
        scalar  "shadow_ray_extension"   default 0.0,
        boolean "emit_direct_photons"    default off,
        color   "transparency"           default 1 1 1
    )
    version 9
    apply light, emitter
end declare

on 启用或禁用灯光。

multiplier 设定强度,tin_color 修改灯光颜色。颜色为白色且 multiplier 是 1.0 时,发出的灯光在强度(和颜色)上等于最终聚集看到的环境灯光(如果允许发送数千个最终聚集射线)6

通常灯光沿灯光实例的坐标空间的正 Z 方向照射。如果启用了 reverse,它将沿负 Z 方向照射。

cutoff_threshold 是性能优化选项。任何低于该级别的灯光都被忽略,且不跟踪任何阴影光线(其消耗大量的区域光的渲染时间)。当然,由于灯光被忽略,因此场景会稍微变暗,但是可以节省大量额外的渲染时间。

shadows 可以启用和禁用阴影。

如果禁用use_custom_environment,则着色器在全局摄影机环境中查找灯光颜色。如果启用,则调用作为 custom_environment 传递的着色器以查找颜色。

提示:将着色器用作环境入口时,也可以通过将返回纯色的着色器作为 custom_environment 来将该着色器用作“光卡”着色器,例如,使用 mib_blackbody 创建具有给定色温的光卡。

如果启用了 use_custom_environment,但实际上没有传递任何 custom_environment,则着色器将用作白色光卡。

visible 定义光源发射曲面是否可见。禁用该参数后,眼光线、反射光线等光线将直接穿过,仅入口光本身保留不可见(但我们从窗外仍可以“看到”)。启用该参数后,对于眼光线、反射光线等光线,实际灯光发射曲面可见(但对窗外的我们不再可见,即使我们仍可以“看到”环境着色器结果)。将 mia_portal_light 用作光卡着色器时,使用启用模式非常有用。

禁用lookup_using_fg_rays 后,使用 mi_trace_environment() 的常规调用来查找环境着色器。但是,如果一些着色器由最终聚集射线或其他射线调用,则这些着色器的工作方式将有所不同(例如,mia_physicalsky 着色器不显示最终聚集射线可见的太阳的“图像”)。由于 mia_portal_light 的用途是作为“最终聚集集线器”,因此,应该遵循该工作方式。因此,启用 lookup_using_fg_rays 后,它会调用将光线类型设定为 miRAY_FINALGATHER 的环境,以便基于此切换工作方式的着色器可以返回适合最终聚集射线的颜色。

如果 shadow_ray_extension 为 0,则着色器开始跟踪灯光“此处”的阴影光线。如果为正值,则阴影光线实际从“窗外”距离为该值处开始。因此,如果窗刚好有一个大的对象,则其阴影会考虑在内。反之,负值允许阴影光线从“窗内”距离为该值处开始,可以允许它们“跳过”窗附近麻烦的几何体(花、窗帘),否则这些几何体将会给阴影引入噪波。

启用了 emit_direct_photons 后,灯光将仅射出直接光子,不会实际射出任何直接光。

transparency 参数有两个函数。

示例

在本节中,将使用入口光与以前版本 mental ray 中可用的光线进行比较以检查其优点。

使用以下场景7

我们的场景、使用入口光、GI 和 FG。
我们的场景、使用入口光、GI 和 FG。

场景的照明只来自太阳和天空,房间内部没有任何类型的光源。

不使用入口光

若要清楚地介绍以下场景中什么是直接灯光和间接灯光,我们需要在此处显示禁用入口、全局照明和最终聚集的场景。

我们场景的直接照明
我们场景的直接照明

上面的图像显示孤立的直接灯光。这意味着该结果最终聚集将“看到”- 非常高对比度的场景,包含完整的黑度、地板上直接太阳光的热点和非常明亮的天空,以及太阳照射的外部地面 - 最终聚集算法的次优输入。

如果以相对较低的设置启用最终聚集,将获取以下图像:

具有 50 束光线且密度为 0.1 的 FG
具有 50 束光线且密度为 0.1 的 FG

此图像一点都不美观。它上面有斑点,工具架似乎“悬浮”在墙上,更糟的是,它还非常暗。为什么会这样?

原因是高对比度输入。最终聚集包含一个过滤器,用于在某些离群的最终聚集射线照亮一个非常明亮的对象时避免斑点结果,因此该过滤器会移除最亮的光线。但是,我们的场景高对比度,实际上我们期望某些光线比其他光线更亮。

使用 FG 过滤器 = 0
使用 FG 过滤器 = 0

在本实例中,过滤器实际上是执行我们尝试执行的操作。可以禁用过滤器,如上图所示,这将帮助我们进行灯光分布,但不是斑点,也不是断开工具架与墙的连接。

由于我们正在使用 mia_material,因此我们可以使用内置环境光遮挡帮助完全解决这些情况。但是,调大该设置仅起到部分作用:

添加 AO - 帮助有限
添加 AO - 帮助有限

过去可用的单一解决方法是简单地提高最终聚集设置的质量。自然我们将使用非常低的设置,因此,此阶段的质量很差也就不足为奇。调大按钮:

具有 250 束光线且密度为 0.8 的 FG
具有 250 束光线且密度为 0.8 的 FG
具有 500 束光线且密度为 1.5 的 FG
具有 500 束光线且密度为 1.5 的 FG

是,增加射线的数量和密度有所帮助,但这将大大影响渲染时间。即使使用高设置,我们仍然无法获得最佳结果。我们不得不提高设置以解析所有细节!

将高的最终聚集设置向下调节片刻,集中进行光线传输。场景仍然很暗,因为我们仅获取一个最终聚集反弹,且因为天空照明是间接照明,因此无法获得该灯光的反弹!意义:在该场景中,太阳光反弹一次,但天光根本不反弹!

将反弹次数提高到 3:

反弹次数为 3 的 FG
反弹次数为 3 的 FG

这样可获得更多的灯光。由于我们将“高的”最终聚集设置调低,因此,照明不平滑且缺少详细信息。

使用最终聚集多次反弹只是 mental ray 传输场景中灯光的一种方法。替代方法是使用光子(全局照明)。但是切记,启用了光子后,最终聚集返回到单个反弹,使光子处理所有剩余的反弹:

具有 GI(光子)的 FG
具有 GI(光子)的 FG

现在发生某些奇怪的事情:颜色向黄色移动。为什么会这样?这是因为天空不会生成任何光子。因此,现在具有多个高质量的太阳反弹,但我们回到零个天空反弹!

使用入口光

现在转换为入口光。首先禁用所有最终聚集和全局照明,且只简单地向具有默认设置的窗添加一个入口光。生成的图像如下所示:

仅入口光,没有 FG 或光子
仅入口光,没有 FG 或光子

其颜色看起来类似于上面的之前最终聚集结果,但细节级别高很多。由于没有继续插值,因此工具架安全地挂在墙上。所有阴影包含详细信息的细节。

由于现在它是直接光,启用了它后会被最终聚集选中。比较使用入口光和不使用入口光这两种情况下最终聚集“看到”的内容:

不使用入口光
不使用入口光
使用入口光
使用入口光

左侧是不使用入口光时最终聚集“看到”的超高对比度结果,而右侧是一个良好的平衡场景。不仅使用细微的直接光填充了它 - 对于最终聚集,天空本身实际上不可见,因此它永远不会出现照亮高对比度区域的情况8,且最终聚集过滤器的美观问题也就随之消失。

直接的入口光的第二个功能是启用了最终聚集后,可以“免费”获得一次灯光反弹:

天空照明的一次免费反弹,入口光作用
天空照明的一次免费反弹,入口光作用

请注意,窗内的墙上现在具有一些天光的反弹光,即使我们使用具有单个反弹的最终聚集!

使用入口光和 3 个漫反射反弹
使用入口光和 3 个漫反射反弹
使用 GI(光子)
使用 GI(光子)

启用多个漫反射反弹(在左侧)使图像更生动。启用全局照明(光子)现在会产生更加平衡的图像,因为入口光实际上发射光子!不再偏向于反弹太阳光,同样也反弹光子形式的天光。

最后,启用一个室内灯光,然后使用入口光 transparency 参数阻止室外视图的过度曝光,以便获得最终图像:

最终图像
最终图像

总结:入口光在以下方面起作用...

天光的细微相互作用,入口光作用
天光的细微相互作用,入口光作用

光度学灯光

问题

使用基础 mental ray 着色器渲染具有全局照明(使用光子)的物理校正场景时存在的一个问题是正确平衡光子能量和直接光。原因是强度通常指定为某些给定方向的强度(例如,聚光灯上的峰值强度),但是能量是所有方向中的所有这些强度的总和(或从技术上讲,积分)。

例如,对于聚光灯,强度峰值相同时,需要的不同光子能量取决于聚光灯圆锥体的宽度和该圆锥体内强度分布的形状。虽然可以计算数学定义的强度分布(如聚光灯圆锥体),那灯光剖面定义任意分布呢?

此外,为确保灯光的光子解决方法的最佳收敛,该灯光的强度基于灯光方向而发生变化(例如,聚光灯或使用灯光剖面的灯光),用户应该以不同的密度发射类似能量的光子,而不是在不同的方向发射不同能量的光子。因此,给定点的每区域能量值(光子能量的密度)必须匹配到达该点的直接灯光。

解决方法

要解决所有这些问题,需要引入 mia_photometric_light。它使用灯光强度来平衡光子能量,方法是对所选的灯光强度分布进行数字化整合,以自动计算出正确的光子能量,并且还自动调整光子密度以适应强度分布。

若要使用它,只需使用与光源的两个灯光和光子着色器都相同的着色器实例即可。光源必须具有原点(即,该着色器对无限光源无效)。必须将光源设定为发射光子,并且必须为其指定非零能量值(虽然实际值将被着色器所覆盖,但非零的能量值是必需的;否则 mental ray 不会为该光源发射任何光子)。指数应始终为 2。如果光源是聚光灯,应使用扩散值。有光灯光的信息,请参见 mental ray 手册。

shader "myLight" "mia_photometric_light" (
    "on" true,
    "color" 1 1 1,
    ...
)
light "theLight" = "myLight"
	emitter = "myLight"
	origin 0 0 0
	energy 1 1 1
	exponent 2
	caustic photons 20000
	globillum photons 20000
end light

着色器声明如下所示:

declare shader "mia_photometric_light" (
       boolean "on"           default on,
       scalar  "multiplier"   default 1.0,
       color   "color"        default 1.0 1.0 1.0,
       # How to define the light intensity
       #   0 = using a manual peak intensity in cd
       #   1 = using a total amount of lumen 
       #   2 = using the information stored in the IES file
       integer      "intensity_mode",
       scalar       "manual_peak_intensity_cd",
       scalar       "manual_flux_lm",
       # How to define the light distribution
       #   0 = Isotropic spherical distribution
       #   1 = Spotlight distribution
       #   2 = using the information stored in the IES file
       integer      "distribution_mode"   default 0,
       scalar       "spotlight_cosine_bias",
       lightprofile "profile",                  
       # Scene and lighting unit management 
       scalar      "units_to_meter_scale" default 1.0,
       scalar      "cm2_factor"           default 1.0
    )
    version 2
    apply   light, emitter
end declare

on 启用或禁用灯光。

multiplier 允许调整强度,如黑暗。仅当该值为 1.0 时,下面提到的强度设置才精确。

color 是灯光的颜色。仅当这是一个规格化的颜色(即,颜色的 mi_luminance () 为 1.0)时,下面提到的强度设置才精确。幸运的是,函数(如 mib_cie_dmib_blackbody)都返回规格化的颜色。

intensity_mode 指明定义灯光强度的参数以及单位:

distribution_mode 定义灯光在不同方向的分布:

由于使用现实世界单位的物理照明高度依赖比例,因此,units_to_meter_scale 定义了多少个场景单位等于一米。例如,如果一个场景单位是 1 毫米,则将有 1000 个场景单位。

最后,cm2_factor 是像素值和每平方米烛光亮度值之间的转化因子。简而言之,此选项应匹配 mia_exposure_photographic 着色器的 cm2_factor 以生成在摄影上正确的渲染和强度。请参见单位页。


脚注
1
值 0.318 (1/pi) 源自理论上完美的 Lambertian 反射镜的照度/亮度比。
2
针对 6500k 白点计算得出。
3
否则,这将会导致最终聚集解决方法中产生噪波且向场景添加的灯光过多。
4
从着色点看到的窗的对向立体角。
5
这是大多数 OEM 应用程序设置 mental ray 区域光实例的方式。
6
对于最终聚集过滤器 0,无偏模式。
7
示例场景几何体的大部分由 Giorgio Adolfo Krenkel 提供。
8
尽管因太阳引起的直接照亮地板上灯光池的最终聚集射线将确实看到高对比度。