Skip to main content

为了简化步骤,专注技术点。这篇笔记中展示的渲染效果,仅使用了sparse工具架上的spreading fire来创建,只不过是把蔓延取消了,初始就是整个模型发射火焰。

缓存优化

缓存的优化无非就一个目标,减少缓存的数据量。这样既可以减少资源的占用,又能加快缓存的读写,节省时间。

火焰的缓存优化很简单,包括SOP中的pyrosolver节点本身就提供了这个优化。

sparse模式下的pyro解算虽然使用的是vdb数据,但是解算出来的结果仍然还是volume格式。这个节点可以让我们先把结果转换为vdb数据,然后降低vel场的精度,最后还可以勾选使用16bit的数据。

我们分别来手动添加节点实现这个功能,然后顺便说一下每个步骤的必要性。

首先使用Dop I/O获取到数据后,需要将数据转换为16bit的数据,默认houdini是使用的32bit数据进行计算的,但是对于渲染来说,16bit的数据足够用做渲染了,这样压缩后就可以让缓存体积显著减少。

转换的方式就是使用volumecompress节点。添加后勾选Use 16bit Float就可以了。

然后使用convertvdb将数据转为vdb格式。

传统的volume相当于整个数据的bounding box内都包含信息,哪怕这些信息本身都是空的。而vdb则可以在只有数据的地方包含信息,舍弃掉空的部分,这样就节省了很多资源。

但是因为之前的数据格式是volume,它不能记录矢量数据,所以速度场分别使用了三个通道的数据来记录,直接转为vdb也会这样继承下来,所以需要添加一个vdbvectormerge,将这三个通道合并为一个矢量的通道。好在这个节点添加后不需要更改什么,默认就会去找后缀是xyz的数据然后拼合在一起。

最后我们使用vdbresample,将速度场的精度降低一半。我们如果用到了速度场,一般来说是用来渲染动态模糊。这个数据其实并不需要很精确,所以可以将速度场的精度降低一半,然后进行缓存。

这样我们就完成了对数据的优化,可以进行缓存了。

渲染技巧

houdini工具架的火焰,默认是使用了pyro post-process来进行渲染的。但是如果是爆炸的工具架,则是默认使用pyro bake volume。相比来说,后者的预览效果更接近渲染效果,参数的调节也很材质球的参数很像。pyro bake volume还提供了scatter功能可以很轻松的做出爆炸的材质,这个在这里不细说。

但是两者最大的区别是,pyro bake volume对于火焰的渲染,完全使用了temperature通道,也就是说火焰的亮度和颜色都是依靠temperature数据来映射。而在pyro post-process节点中,火焰的亮度则是靠flame通道来映射。这样来看,使用pyro bake volume可以少缓存一个通道。

当然,渲染的前提是一定要使用ACES色彩空间!

首先pyro bake volume这个节点有一个小bug,就是如果你的density通道如果没有数据,就是说density后面的精度显示的都是0。那么在预览视窗中可以正常看,但是渲染不出来。而一般做火的话,没有添加density烟雾,就会出现这个问题。

所以在使用这个节点之前,需要添加一个volume wrangle,在里面写入
@density = 0;
这样即便我们的density数据都是0,但是也是存在数据的,就不会再出现渲染不出来的情况了。

而这个节点的设置也很简单,首先找到temperature的最大值,输入到Range中,这个最大值在solver里能勾选显示,在DOP I/O里也有。有一个正确的范围值,才能更好的控制映射范围。

这里的重点是在intensity中使用Use Ramp模式来调整,如果使用默认的constant,那么渲染出来的效果是这样的:

经过后期调整

而使用Use Ramp,我们可以自定义温度场对亮度的映射关系,从上面的参数中能看出来,我们舍弃了最低和最高的温度场范围,这样可以让边缘和最内部不发生亮光,由于内部最高温的位置不产生亮度,内部就出现了真空部分,更容易产生火焰拉丝的效果。

而在箭头部分并不是数值为0,而是稍稍给了一些数值,让这里和最边缘处有一个过渡。这样最边缘处不会立刻停止发光,而是有了一层特别弱的发光渐变到0。这个就可以做出周围环境或者烟雾被火焰照亮的感觉。

也就是说虽然我们并没有density数据,但是还是通过调整材质达到了烟雾的感受。

另外还有个问题,我在这个效果中没有发现,但是可以描述下。就是尤其是在制作火焰在表面蔓延的时候,火焰跟表面会有一些穿插,在蔓延的时候还会明显感觉到有一层火焰的“膜”在物体表面上蔓延。为了消除这个效果,我们可以使用速度场来影响temperature,在物体表面的火焰一般是速度较低的火焰,那么可以通过vex,让速度低的部分temperature很低或者直接为0,这样就不会在渲染中看到了。

这段代码是这样的:
float min = chf(“min”);
float max = chf(“max”);
@temperature *= fit(length(v@vel),min,max,0,1);

具体的速度最大值和最小值,则需要通过观察来找到合适的值了。

合成技巧

在合成中,首先使用Grade节点,降低一点gain,这个纯属我的个人习惯,可以忽略。不过下面的都是必须的了。

在color corre中,提高highlight中的gain值,可以让高光的亮度更强,这样火焰就有了一个hot core,而不是整个都是一种亮度的感觉,它在最亮的部分应该是格外亮的。

然后使用hueshift偏移下色相,默认ACES渲染出来的总有些发橙,看上去有点太CG了,偏向黄色一些可以让火焰更真实一些。

最后就是添加辉光,我这里用的是辉光插件,nuke自带的辉光可能需要叠加好几层才会出来比较好的效果。

这些就是合成的小技巧了。就酱。

(完)

One Comment

Leave a Reply