前段时间在 katana 里测试 instance 遇到了一些坑,闲暇之余记录一下。
第一种方法:利用 katana 自带的 CopyLocationToChild1 把需要 instance 的物体 copy 到对应的层级,然后设置对应的 translate, rotate, scale 属性。
优点:这种方法异常简单,写在 OpScript 里运行也异常的快。灵活性相当高,比如说在 instance 的时候换个帽子,换件衣服什么的。比较适合 crowd instance。
缺点:渲染异常的慢。因为它的原理是把对应的模型不停复制,然后放置到对应的地方。假如有个模型只有50个面,你复制10次,那么场景里就有500个面。
根据 PRMAN 的官方文档 Instancing in Katana2 ,里面提供了两种方法。
第二种方法:设置好 instance source 组。在 instance 组里指定 geometry.instaceSource 属性对应到 instance source 组的层级。
优点:对于手动 debug 来说比较方便定位到 instance 的东西。渲染速度非常快,因为同样的 mesh 不会重复。
缺点:编程就比较困难了,毕竟要处理一堆字符串。所有 instance 的物体是视图上看不到的,只能在渲染时看到。不够灵活,只适合 instance 没有变化的物体。每种 instance 需要对应一个层级。
坑:需要先把 instance group 设置好,再设置 instance。
第三种方法:设置好 instance source 组,并添加 instance.ID 属性。在 instance 组里指定 instance.ID 属性对应到 instance source 组的 instance.ID。
优点:编程上会相对方便很多,因为我们不用处理层级字符串了。渲染速度非常快,因为同样的 mesh 不会重复。
缺点:通过手动去 debug 会比较困难。所有 instance 的物体是视图上看不到的,只能在渲染时看到。不够灵活,只适合 instance 没有变化的物体。每种 instance 需要对应一个层级。
坑:需要先把 instance group 设置好,再设置 instance。
第四种方法:根据 katana 的官方文档 Instancing3,我们很容易创建第四种 instance。
优点:渲染速度非常快,编程非常方便,多种 instance 只需要一个层级。
缺点:所有 instance 的物体是视图上看不到的,只能在渲染时看到。不够灵活,只适合 instance 没有变化的物体。
坑:需要先把 instance group 设置好,再设置 instance。