[vfxinfo 原创]Houdini配合Arnold制作大型复杂的植被流程研究

vfxinfo原创 转载请注明作者与出处

原创作者:ArthurChiu
使用软件:Houdini Arnold
版权归原创作者ArthurChiu所有
作者主页链接:http://blog.sina.com.cn/s/blog_7ecf408b0101p0o8.html

最近一直在研究一套高可控、高效率的制作大面积植被的流程来配合Arnold这款渲染器做渲染,目前商业化的插件比如Speedtree,Max Multiscatter都可以实现此类功能,包括Vue,但其可控性来说还是有限制,能够实现的效果也有一定的局限性,因此笔者研究一套关于使用Houdini配合Arnold来渲染制作植被的流程(上图实际渲染分辨率为4k,由于限制问题,此图为1k分辨率)。

众所周知,使用代理分布是实现宏观场景的有效办法之一,Arnold也提供了相应的功能,Archive,在Max平台下有类似于 Multiscatter功能的插件可以高效的分布代理,而市面上也提供了大量的Max场景的植被库文件,因此想要在Arnold这个渲染器下使用,就得 将max文件转换成通用数据格式,比如Obj、Fbx或者Abc,然后制作成Ass文件作为Arnold代理物体,这里笔者将跳过转换的过程,转换后导入 Maya的结果如下图:

这是从Max库文件里导入Maya后的显示,下面我们来做一些渲染测试对比(笔者使用的8G内存和I7 2670QM):

渲染出来的结果接近4个小时,使用的是默认的标准材质,开启了Backlight和SSS,渲染缓慢原因是由于大量的树叶带有透明贴图,这不是 Arnold的优势因此只要将透明贴图的物体转换成实体的模型就可以解决问题,但经过笔者测试以后发现,其转换后的数据量大的惊人,可以达到2个多G的 数据,即使转换成Ass文件也非常大庞大,此时笔者想到了用粒子或者点来代理这些树叶,经过测试结果是理想和可行的,那么如果具体操作呢?其实转换的过程 很简单,就以一片树叶为例,如下图所示:

转换所涉及的问题无非就3点,位置,大小和朝向,在Houdini下朝向可以用N(法线)来代替,这里我们简化说明方式,用0、1、2、3来替代说明 Point1、2、3的位置,用”-“替代说明减法,下面我们具体说下这个算法,用(0-1)/2获得位置信息,用0-2叉乘0-1得到一个法线矢量,通 过Length(0-3)获取树叶大小信息,在Maya里也可以通过表达式去计算,粒子属性里有Aim属性(这是可以利用的),回到之前的话题,通过计算 后这样就可以完美转换成实体模型,其结果如下图:

实体模型是通过Trace这个节点实现的,如果有Houdini使用经验的话,应该熟悉这个节点,这里不是我们讨论的重点,回到之前的话题,我们能转换一片树叶,那么剩下的事就是交给程序自己去跑,将所有树叶都转换成Point点信息,其结果如下图所示:

有了这些点信息,我们就可以做代理使用了,这里笔者提供一个小的Maya测试场景说明这个方法的可行性,使用方法:

1.打开默认提供的场景
2.执行Mel后将弹出窗口
3.Leafs物体添加窗口演示1中
4.将Instance_leaf物体添加如窗口2中
5.点击Creat Tree

下载地址:http://pan.baidu.com/share/link?shareid=2938422260&uk=3375094246

(ps:这个脚本是笔者早年写的,后续没有继续优化,只在这里作为透明贴图物体转粒子代理的一个思路说明,后续会用其他方式在一套解决方案里提供)

注意:对于脚本的使用,vfxinfo网站包括原作者ArthurChiu在内不承担任何后果,请按需自行使用,在使用前请备份好您的原始文件,以免给您造成不必要的损失.转载请注明作者与出处!!!

下面我们在Maya里做渲染对比测试下,先导入代理好的场景,显示结果如下图:

下面进行渲染测试,结果如下:

渲染时间为8分钟左右,无论质量和速度,实体模型都高于透明贴图,这个流程比较适合Arnold这个渲染器,下面我们来制作一片树林的效果来分析和测试下,笔者已经制作好了代理的物体,如下图:

图A和图B是Houdini下显示的分布代理图,导入Maya后的显示结果为:

下面进行渲染测试:

渲染时间为40分钟左右,这里使用的是嵌套代理,笔者发现在使用嵌套代理的时候,Color属性是无法像Xform一样被继承的,因此需要考虑其他的解决 办法,以后再做这块的讨论,这里还是比较传统的代理来制作静态的场景(物体没有动态效果,非摄像机运动),下一部分我们将来讨论有关动态效果的代理制作流 程。

因为是要做动态的代理,因此需要动态的库文件,Max自带的库文件很少带有动态数据(没有动画数据),为此笔者选择自己制作带有动画的植被文件,考虑到圣诞将至,就以松树为选题,下面是一些实拍的参考图片:

笔者通过观察和研究,最终决定用实体代理方式来分布针叶,又考虑到机器配置限制问题,不能每一个针叶为一个实例,须用多簇针叶为一个实例来进行分布处理, 然而这样的做法会降低还原度,每一个针叶都应当有不同的属性,比如颜色,如果用多簇针叶的做法显然会降低生物多样性的特点,笔者选择通过 SpeedTree来生成动态的松树模型,在制作时,为了达到比较好的动态效果,模型的还原度就必须较高,笔者在现有的16G内存下所能达到的极限如下图 展示:

树干和枝干

用于替换的树叶局部显示

导入到houdini后,显示如下:

在没有替换针叶前,场景的模型数量为

下面,我们来为针叶做替换和代理处理,和此前方法一样,通过前面提到的替换方法,将所有面片的针叶替换为实体的针叶模型

替换的实体针叶模型,模型的参考信息这里我们记下27个面数,以作数据分析使用),替换后单一模型显示如下:

全部针叶转换后的参考点如下:

点数为45万个点,然后和之前的27相乘,得到1218万左右的针叶面数,如下图所示:

下面是树干的参考显示:

模型的数量在下面我们来对比下数据,转换前模型的总量在72万左右,转换后模型的总量在1246万左右。

接下来,我们分别导出树干和针叶的ass代理文件,因为是要做动态的,所以需要逐帧导出ass文件,而在制作带有动画的代理时,最麻烦的问题在于其运动模 糊不能程序化的生成插值信息,因此这里笔者采用的办法是导出带有运动模糊信息的ass文件,当然制作模糊的办法可以放在后期来做,笔者这里只是一种极端测 试而已,这种方法最大的问题在于修改问题,不可能每做一次修改,就重新生成ass文件,这是非常耗时的,因此在实际项目中,如果需要导出带有模糊信息的 ass序列文件时,最好在previs中就测试好镜头和模糊值(包括和后期的配合),当然这种流程不一定是最正确和有效的(如果有更好的办法,也希望大家 一起讨论……)

接下来,就是渲染,渲染参数Sample AA 12 其余为1,尺寸4096*2160。场景设置如下:

下面是渲染的局部细节图:

此渲染用了接近10G内存,使用默认标准Shader,灯光没有做细节的调式,只做渲染参考,下面是渲染的动态预览

此次渲染带有运动模糊,针叶的采用的是Xform运动模糊,枝干采用的是Deform运动模糊,导出带有模糊信息的Ass文件在Maya里有严重的Bug,因此笔者通过重新计算得出正确结果(在上一篇中有具体提过),下面是开启和关闭运动模糊的对比图:

No MotionBlur

With MotionBlur

小结:通过测试,此方法适合大型项目的特写镜头,代理的数量不宜过高,上百万级别的代理内存上开销也比较大,这个和代理模型的复杂程度关系不大,而是和程 序有关。因此在表现大场景的时候尽量减少代理的开销,目前由于是Archive机制的方法导入Arnold进行渲染,在内存管理上,一旦光线碰到 Boundingbox时,会将场景全部加载,内存也会大量的增加,所以此类方法还有优化的潜质。

总结一下,既然是配合Arnold做渲染,那么需要注意的是:

1.Arnold在透明贴图使用上目前内置的Shader无法提高效率,因此在制作的时候切忌大量使用透明图。 

2.Arnold采用的是蒙特卡洛算法的渲染器,也没有光子图,因此更适合做动态场景,这样才能发挥其大场景渲染的优势,上面渲染的所有图片只是测试而 已,没有再对效果进行深入的调节,因为这里讨论的是制作流程,有人会问一个简单的代理为什么要在Houdini下做呢?其实就是为了高度可控,在 Houdini下可以修改代理的任何属性并传递到Arnold里,并且可以实现更加复杂的代理动态效果,比如树叶的掉落、万箭齐发、千军万马等,这些技术 笔者会陆续更新出来,敬请期待…………。

最后附上一些实际案例:

  • author image
    十二 19, 2013 @ 9:42 上午

    学到很多 很有帮助,也很有感慨,我需要更加努力

  • author image
    低调些好 回复
    十二 19, 2013 @ 11:31 上午

    李京

  • author image
    四 11, 2014 @ 16:46 下午

    弱弱的问下 我为什么用了standin渲染不出来树叶材质 我没有把透明贴图转模型 standin 不支持透明贴图么

  • author image
    十一 29, 2014 @ 8:56 上午

    如果有个视频教程教如何做就好了 对houdini的确不熟悉 看着比较费劲儿 有个视频教程就可以照着一步步做了