What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
vfx:houdini:concepts:geo:primitive [2019/10/08 09:12] – [Packed fragments] codingharevfx:houdini:concepts:geo:primitive [2021/11/11 08:07] (当前版本) codinghare
行 2: 行 2:
 <color #7092be>//Ver.17.5//</color>\\  <color #7092be>//Ver.17.5//</color>\\ 
 Houdini 关于 //Primitives// 的相关知识点 Houdini 关于 //Primitives// 的相关知识点
-===== =====+----
 ====什么是Primitives==== ====什么是Primitives====
 在 //Houdini// 中,//Primitive// 代表了几何体的单位。//Houdini// 中可以表示为 //Primitive// 的单位有: 在 //Houdini// 中,//Primitive// 代表了几何体的单位。//Houdini// 中可以表示为 //Primitive// 的单位有:
行 65: 行 65:
   * 如果对 fragment 使用 ''unpack'' ,那么只有那一部分的模型会被复制到内存中(very nice!8-))   * 如果对 fragment 使用 ''unpack'' ,那么只有那一部分的模型会被复制到内存中(very nice!8-))
   * 需要注意的是,如果删除了较多的 fragments, 那么使用 //Packed fragment Primitives// 将比使用源几何体更加**低效**。这是因为 Houdini 会一直为所有 fragments 保留整个父、源几何体的备份(即便是 fragements 只剩一点点)。因此这种情况下,相较于直接使用源几何体,Houdini 会消耗更多的内存。\\ 解决方案是:在 fragments 不多的情况下使用 ''unpacking'' 将剩余的 fragments 转化为实体对象使用。   * 需要注意的是,如果删除了较多的 fragments, 那么使用 //Packed fragment Primitives// 将比使用源几何体更加**低效**。这是因为 Houdini 会一直为所有 fragments 保留整个父、源几何体的备份(即便是 fragements 只剩一点点)。因此这种情况下,相较于直接使用源几何体,Houdini 会消耗更多的内存。\\ 解决方案是:在 fragments 不多的情况下使用 ''unpacking'' 将剩余的 fragments 转化为实体对象使用。
 +===How to===
 +  * 转换一般几何体到 Packed 几何体:''Pack''
 +  * 分离 Packed 几何体中的子物体:''Unpack''
 +  * 将几何体按照 Packed 几何体导入 DOP :''DOP Import''
 +  * 在 VEX shader 环境中访问 Packed 几何体中的属性(比如 ''Cd''):''renderstate(packed:Cd, PackedCd)''
 +<WRAP center round info 100%>
 +我们只能以 material attribute 的方式在 GEO 层级使用 primitive attribute。 除了 material attribute(Houdini 按照特殊情况处理),primitive 层级的属性是不能在一般的场景中工作的,因为 Houdini 将 Packed 几何体视作单个 primitive 加上一个点。 
 +</WRAP>
 +===Rendering===
 +//Packed Primitives// 在渲染中是非常有用的。//Packed Primitives// 允许我们生成 //IFD//,并且渲染更快,内存 / 硬盘空间使用更少。
 +\\ \\ 
 +==Material assignment==
 +当我们对标准的几何体指定材质的时候,我们可以在两个层级下应用材质:
 +  * 在对象层级(Object Level)下
 +  * 在几何层级(SOP Level)下,使用 ''Martial'' 节点(该应用覆盖对象层级的材质)
 +当 Houdini 生成场景描述文件(IFD)的时候,Houdini 会检查对象和几何体中与材质相关属性;因此 Houdini 知道哪个 shader 需要包含在这个 IFD 中。
 +{{ :vfx:houdini:concepts:geo:packedprimitiveforrender-01-min.jpg |}}
 +但当我们使用 //Packed Primitives// 的时候,Houdini 还提供了第三种渠道来应用材质:通过嵌入在 //Packed Primitives// 中的 Material attributes 来应用材质。该层级的材质将**覆盖**之前提到的几何体层级与对象层级应用的材质。\\ \\ 不过当 Houdini 生成 IFD 文件的时候,Houdini 并不会查看这个 Material attribute 属性(可能因为是文件太大,扫描起来太慢)。因此,Houdini 不会将该 Material attribute 对应的 shader 添加到 IFD 中。只有当 Mantra 解包(Unpack)这些 //Packed Primitives// 的时候(处于 render time),Houdini 才能进行对材质的搜索。因此,如果之前并无匹配的材质属性,那么渲染出来的模型很可能就会缺失材质:
 +{{ :vfx:houdini:concepts:geo:packedprimitiveforrender-02-min.jpg |}}
 +为解决这个问题,我们需要告诉 Houdini 将所有场景中的 Shader 信息包括到 IFD 中(不管是什么层级中应用的)。我们可以开启 ''Save all SHOPS'' 选项(在 Mantra 中)。这样的话,只要 //Packed primitives// 带有 shader,那么就一定会出现在渲染的结果中。
 +{{ :vfx:houdini:concepts:geo:packedprimitiveforrender-03-min.jpg |}}
 +==Displacement and subdivision surfaces==
 +在 //Displacement shading// 和 //Subdivision Surface// 的处理上,Houdini 采用了同样的策略对待 //Packed Primitives// 和一般的几何体。但当我们主要使用 //Packed Primitives// 时候,我们需要考虑 //Dicing//(分治?)。
 +  * 在渲染被置换(displaced ) / 细分(subdivided )的表面之前,Mantra 会将几何体划分为更小的块,直到每个像素都有 ''1'' 个匹配的“块”(与 ‘’shader quality‘’ 有关,这里是 ''1'')。这意味着越靠近摄像机的对象,越细分的厉害(离摄像机越近,所占的像素区域越大)
 +  * 当我们使用 //Packed// 几何体作为实例的时候,就会出现问题了。//Packed// 几何体作为实例的好处是共享源几何体;但当添加了置换与细分之后,Mantra 必须要分别加载每一个划分后的部分,这就导致源几何体不再被分享了。
 +  * 解决这个问题需要添加 //Share Displacements Between instances// 渲染属性到包含实例的对象。开启这个选项会告诉 Mantra 做以下的事情:
 +    * 对于场景中某一个实例进行的最高级别的划分
 +    * 其他实例共享该划分过的实例
 +  * 这意味着远处的对象可能会获得更多的(不必要)的细节。这可能会导致渲染的减速;但因共享而带来的好处可能要更加有价值一些。 \\ \\ 在比较极端的情况下,如果上述这种“不正确”的划分导致了问题,我们可以将该用于分享的实例分解为两个对象,一远一近。这样我们就可以对不同的对象进行不同等级的细分,从而达到按照远近进行恰当划分的效果。\\ \\ 同时,我们也可以解包离摄像机近的对象,将其从 ''highest necessary dicing level'' 选项中移除。
 +==Attributes==
 +  * Disk / Memory Packed primitives 中的实例实质上是一个简单的指针。该指针指向被分享的源几何体的内存地址(或硬盘位置),因此所有的实例都无法拥有自身的属性(除开 material / vel attribute ,Houdini 对该两种属性做了特别处理)
 +  * Packed fragment 实例可以拥有//独立//的属性,因为这些 fragment 是被“//拼合//”在一起的(引用的源几何体的子集)。但这也意味着 Packed fragment 的效率并不如 Disk / Memory Packed primitives 。
 +  * Alembic primitive 也不能拥有自身的独立属性。不过,在 Mantra 中,针对 Alembic 有一个 ''unshare'' 的选项。该选项会消耗大量的内存,但允许 Alembic 的实例拥有独立属性,并可以在 render time 使用。
 +<wrap lo>How Material / Vel works</wrap>\\ \\ 
 +Mantra 会为 Packed primitives 建立一棵虚拟的对象树,然后会将对应的 material attribute 拷贝到该书上的每一个虚拟的对象(如果这些虚拟的对象都没有 material attribute 的话)。因此 几何体对象上的 materials 将会正确的应用到 Packed primitives 上;''vel'' 同理。
 +\\ \\ 
 +可以通过 ''Render State''(VOP)/ ''renderstate'' (VEX)访问在 //Packed primitives// 上的属性。
 +\\ \\ 默认情况下 Houdini 不会查看 //Packed primitives// 中的 ''material'' 属性。在 Mantra 中启用 ''Declare all SHOPs'' 可以修复该问题,但也会导致 IFD 体积增大。
  
 ====Polygon soup==== ====Polygon soup====