体积着色器

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

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

着色

Principled Volume

Principled Volume is a physically-based volume shader that can be used to create a wide range of volume materials. It supports scattering, absorption and emission in one easy to use node. Fire can be rendered with blackbody emission.

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

Smoke and fire rendered with Principled Volume shader.

Volume Components

For more control, volume shading components can be manually combined into a custom shader setup.

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

体积吸收,散射,发射

Attributes

When rendering smoke and fire, volume attributes are used to define the shape and shading of the volume. The Principled Volume shader will use them by default, while custom volume shaders can use the Attribute node to get attributes such as density, color and temperature.

密度

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

Volumes in the real world consist of particles, a higher density means there are more particles per unit volume. More particles means there is a higher chance for light to collide with a particle and get absorbed or scattered, rather than passing straight through.

Mesh Volumes

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

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

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

世界体积

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

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

Multiple Scattering

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

For rendering materials like skin or milk that require multiple scattering, subsurface scattering is more efficient and easier to control. Particularly the random walk method can accurately render such materials.

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

局限点

未在GPU上实现的功能:

  • Multiple importance sampling for efficient lights inside volumes.