体积着色器

体积渲染可以用来实现像火,烟,雾,或者玻璃吸收光的渲染效果,以及许多不能单独被表面网格所表现的效果。

要设置体积着色时,先要创建一个包含这块体积的网格区域。在默认材质节点中,移除表面节点,连接体积内部的节点,以此来定义内部纹理。要模拟玻璃的吸收效果可以把表面着色器和体积着色器都加上。世界设置也可以使用体着色器来模拟烟雾等效果。

着色

Principled 体积

Principled Volume 是一个基于物理的体积着色器,可用于创建广泛的体积材质。它支持在一个易于使用的节点中进行散射、吸收和发射。火可以用黑体发射来表示。

../../../_images/render_cycles_materials_volume_principled.jpg

通过原理Principled着色渲染烟雾和火焰。

体积组件

要获得更多控制,可以将体积着色组件手动组合到自定义着色器设置中。

  • 体积吸收 会吸收部分穿过物体内部的光线。这种效果可以于黑烟或者彩色玻璃中,又或者混合体积散射的节点。这个节点有点像透射BSDF节点,可以让光线部分被阻挡、部分透过。
  • 体积散射 l是让穿过物体的光线在碰到粒子后散射到其他方向。各项异性值决定了光更多的向哪个方向散射。0值让光向所有方向散射(跟漫射BSDF节点很像),负值让光逆向散射更多,正值让光前向散射。这个节点可以做白色烟雾或者云的效果。
  • Emission 将从体积发光,例如用于火。
../../../_images/render_cycles_materials_volume_node.jpg

体积吸收,散射,发射

属性

渲染烟雾和火焰时,体积属性用于定义体积的形状和阴影。 Principled 体积着色器默认使用它们,而自定义体积着色器可以使用Attribute节点获取密度,颜色和温度等属性。

密度

所有的体着色器都有一个密度定义。密度决定了光线有多少需要跟体积进行交互,得到吸收或者散色,还有多少会直接穿透。要模拟烟雾的时候你需要指定一个密度场来说明体积的哪些地方烟比较多(密度大于0),哪些地方是没有烟的(密度等于0)。

现实世界中的体积由粒子组成,密度越高意味着每单位体积的粒子越多。更多的粒子意味着光线与粒子碰撞并被吸收或散射的可能性更大,而不是直接通过。

网格体积

作为体积渲染的网格需要是闭合的,以及符合 流形 。这意味着网格上是不能有开口。每条边必须严格的保证链接到两个面上,不能有洞和T形的面,比如说不能有三个或者三个以上的面链接到一条边上。

想要结果正确,法线必须全部指向外面。法线是用来探测光束是进入还是穿出体积的,如果法线指向错误的方向,又或是网格上有开口的话,渲染器可能根本无法知道体积的内外方向。

这套规则也同样适用于:如何正确地渲染玻璃折射。

世界体积

体积着色器也可以在整个世界中应用,它会填满整个空间。

当前,这种着色器非常适合夜景和灰暗的场景,如果体积着色器被使用,世界的表面着色器和太阳光源都将失效。这是因为当世界背景被设定在无穷远的位置时,对太阳光来说是足够精确的。但是进行模拟雾效和大气散色的时候,填充整个空间并不是一个好方式,因为在太阳光到地球之间实际上是有很长一段距离没有东西(无阻碍光线物质)。这种特效最好是通过创建一个体物体包含整个场景来实现。该物体的大小可以感知光线如何被散射或吸收。

多重散射

实际生活中,比如云朵,使用到的散射或者浅表面散射,涉及了多次的散射反弹。但是在非偏渲染的时候这些效果计算非常慢和多噪点的。在典型的电影制作场景中,一般只用到0次或者1次反弹值以确保可控的渲染时间。 "单次散射" 即渲染时采用0次体反弹,多次反弹是 "多重散射" 。

对于需要多次散射的渲染材质(如皮肤或牛奶),次表面散射更有效且更易于控制。特别地,随机游走方法可以准确地渲染这种材质。

云和烟雾这样没有明确边界表面的材质,体渲染是必须的。多次散射反弹的外观效果更逼真,但是在实际操作中通常会限制反弹次数,为了保证渲染不会耗时太长。

局限点

未在GPU上实现的功能:

  • 多重采样,用于体积内高效灯光。