当场景里的粒子数量越变越多的时候,只要在时间轴上来回拖拽、做灯光测试或者跑渲染预览,都会不停地重新触发粒子的模拟运算,这样很耗时间。在Houdini里面该怎样把粒子模拟的结果缓存下来,又该怎么去规划这些缓存文件的存放位置,关键的地方就在于,先把模拟生成的数据写成硬盘上的文件,之后让其他节点直接去读取这些文件,而不是每一次都从最初的步骤重新算起。对于常见的POP粒子效果来说,一般只需要把点数据缓存到磁盘上就够用了;如果后面还准备从断点接着往下计算,那就可以另外再存一份模拟状态用的文件。
一、Houdini怎么缓存粒子模拟
粒子缓存通常是在模拟结果已经输出之后再去做,模拟还在调整的时候就先让它实时计算,等到参数都确认了,再往磁盘里面写。
1、添加File Cache节点
可以先找到粒子模拟输出的那个节点,在它的后面连上一个叫做File Cache的节点。例如,当POP Network已经把粒子的点数据准备好了,就把File Cache直接挂在它的输出端。File Cache这个节点会把当前节点产生的那些几何信息全都写到硬盘上去,等缓存成功了之后,再把【Load from Disk】这个选项打开,这样一来,后面播放的时候就会直接去硬盘上加载文件,绕过了上游那些重复又耗时的计算步骤。
2、设置缓存帧范围
接下来要进到File Cache参数面板的【Caching】标签页,在【Start】、【End】和【Inc】里把起始帧、结束帧还有帧之间的步长都定好。因为粒子的模拟在前后帧之间经常是互相依赖的,所以要记得把【Simulation】开关打开,让Houdini一帧一帧按顺序去算,而不是用并行的方式随意跳转。根据官方文档的说明,只要模拟序列需要用到上一帧的结果,就应该启用Simulation模式。
3、执行磁盘缓存
然后去点击【Save to Disk】按钮,正式开始把结果写进磁盘。如果这时还想继续在Houdini里操作别的物体,也可以选择【Save to Disk in Background】让它去后台慢慢执行,不过在选用后台模式之前,一定要记得先把当前的hip工程文件保存一下。等缓存任务全部跑完之后,通常【Load from Disk】会被自动打开,这时候再拖动时间轴,软件就会直接读取那些磁盘上的文件,而不会再重新触发一遍计算。
4、参数改动后重新生成
假如后来修改了粒子的发射数量、速度、力场或者碰撞体的参数,那么前面生成好的那份旧缓存就不能再代表当前的效果了。这时应该先把【Load from Disk】关掉,重新检查一遍模拟是不是满意,接着把Version版本号加一,然后再重新写一次缓存。File Cache本来就支持靠Version编号来保留多份不同的结果,所以完全不用担心会把旧的方案给覆盖掉。
二、Houdini粒子缓存路径怎么整理
缓存的存放路径最好是根据镜头、效果、节点和测试版本来分开设置,要是长期把文件混在临时目录里,数量一多就容易互相覆盖,也不方便交接给别人。
1、优先使用工程相对路径
在设定缓存路径的时候,最好是优先用工程目录下面的相对路径,这样就算把整个项目文件夹移走,路径也不容易失效。File Cache默认会把文件存到$HIP/geo这个位置,这里的$HIP代表的就是当前hip文件所在的文件夹。默认的文件名基础部分是由$HIPNAME和$OS组合起来的,它们俩分别对应着工程文件的名字和节点自身的名字。我们可以把缓存节点的名称改得清楚一些,比如叫做filecache_particles_sparks,这样日后只要一看到文件名,就能很快认出它是从哪个节点来的。
2、保留版本目录
建议让Version功能一直保持着,让每一次测试得到的结果各自存进v1、v2、v3这样带有编号的子目录里面去,而不是一遍又一遍地去覆盖同一堆文件。等到确定某些旧版本已经彻底没有用了,再手动到硬盘上把它们清理掉,因为File Cache自己是不会帮你自动删除废弃缓存的,这些维护的活儿得靠人工来完成。
3、使用适合粒子的格式
对于普通的粒子点数据来说,直接用它默认的.bgeo.sc格式就可以了,这个格式既能支持压缩,又可以把Houdini里头的各种几何属性都一并保存下来。如果粒子后面还要做运动模糊,那就要确保v这个速度属性没有被漏掉;要是打算按粒子去追踪,那还得把id属性也保留好。官方文档里头也把.bgeo.sc当作一种通用的几何缓存格式来推荐。
4、区分几何缓存和状态缓存
只是拿来做渲染或者看效果的时候,把粒子的几何信息存成缓存就足够了。但是那种大型的DOP模拟场景,如果后面可能会停下来以后再接着算,那就需要借助Checkpoint功能去存出一个.sim格式的文件,这种文件保留了模拟对象以及它的相关数据,很适合用来恢复整个模拟的运行状态。要注意的是,这类.sim文件不应该和普通粒子播放用的那些缓存随便混在一起,最好给它们分开存放。
三、Houdini粒子缓存路径怎么检查
缓存全部写完之后,还得去验证一下帧序列、文件大小和读取状态是不是都正常,免得等渲染跑到一半才发现中间缺了帧。
1、检查文件是否连续
缓存做完以后,可以先按一下【Open Directory】按钮打开存放缓存的那个目录,仔细对一对起始帧、结束帧以及中间每一个帧号是不是都齐全。要是发现中间有缺了哪几帧,就可以到【Evaluate As】里面去选【Single Frame】模式,单独把漏掉的那几帧补写一下就好了。
2、检查是否仍在实时计算
在把【Load from Disk】打开之后,去来回拖动时间轴,一边拖一边看看播放的速度够不够快,还有节点状态里有没有显示正在从磁盘加载。如果发现它还是不停地去重算上游的那些节点,那就要去检查一下缓存的路径有没有写错、对应的缓存文件到底存不存在,再看看当前的Version是不是被不小心切换到了一个空的目录上。
3、记录缓存用途
在正式项目里面,最好是养成随手记录的习惯,把hip的版本号、缓存节点的名称、帧的范围、Version编号和文件存放的具体路径都记下来。当粒子的参数调整过之后,就去增加一个新的版本,同时千万不要去覆盖那些已经被灯光环节或者渲染环节引用过的旧缓存。
总结
所以,在Houdini里面做粒子缓存,大致的顺序可以这样来走:先接好File Cache,把帧的范围定下来,开启Simulation模式,接着正式写到磁盘里,最后再切换到从磁盘读取的状态。整理存放路径的时候,尽量去用$HIP/geo这样的相对目录,然后依照节点的名字和Version号去分别建立不同的子文件夹。一般用来预览或者渲染的情况,直接采用.bgeo.sc格式就可以了,只有在需要从断点接着往下计算的时候,才额外去补一份.sim状态缓存。照这么一套流程做下来,不管是以后再去调整粒子的效果、跟渲染环节做交接,还是想退回到之前的某个旧版本,都会扎实稳定很多。
