Q100170:如何在 Katana 中开始为对象应用纹理

概括

着色器库和工作室管线以各种不同的方式处理纹理, Katana提供了一个灵活的框架来分配纹理,遵循一些常见的约定。

以下概述了适用于 3Delight、RenderMan 和 Arnold 渲染器的部分选项。另请参阅附件中的示例场景,其中演示了本文所述的两种方法。

 

更多信息

使用材质属性来声明纹理

为每个对象赋予独立纹理的最简单方法是为每个对象创建一个材质,并在着色器中将纹理显式声明为字符串参数。然后,将相应的材质分配给每个对象。

这种方法最费力,尤其是在处理包含大量对象的场景时,而且在需要更改材质时缺乏灵活性。

通常情况下,许多物体可以共享相同的材质,但需要赋予不同的纹理。在这种情况下,可以设置场景,使每个物体都拥有自己的纹理:

 

使用对象属性声明纹理

与其在材质上设置纹理,不如让要渲染的对象通过任意属性指向相关的纹理文件。

Katana中的用户数据和原始变量

渲染器允许使用用户数据或图元变量,这些数据可供着色器查找。在Katana中,约定是将任意几何数据读取为名为geometry.arbitrary.xxx的属性,然后默认情况下,这些属性也会作为用户数据或图元变量写入渲染器。这意味着,如果您使用图元变量或用户数据来指定纹理,则可以自动完成此操作。

Katana中使用 RenderMan 时,可以使用 primvars 来声明纹理。

RenderMan提供了一种跨实例处理纹理的方法,即在实例位置解析着色器参数语法,具体实现方式是使用RenderMan 的 ` <primstr:attributename>` 语法。然而,此功能仅在 RenderMan 24 版本中引入。

 

创建示例场景

以下步骤说明如何使用对象属性在 3Delight 渲染器中声明纹理。

  1. “帮助”>“我想要一个小马”菜单中添加一个 CameraCreate 节点、一个 NetworkMaterialCreate 节点和两个 Pony 节点。请务必更改每个 Pony 节点的名称参数,使其唯一。

  2. 在每个 Pony 的下游创建一个 AttributeSet 节点,并将路径设置为相应上游 Pony 的场景图位置。

    mceclip1.png

  3. 编辑每个 AttributeSet 节点,并将每个 attributeName 参数更改为 'geometry.arbitrary.basecolor.value',将 type 参数更改为 'string'。

    mceclip4.png

  4. 将每个属性集的 stringValue 设置为指向一个唯一的纹理文件。您可以在Katana自带的$KATANA_ROOT/demos/tx_files/目录下找到示例文件,或者您也可以使用本文中附带的纹理文件。

    mceclip5.png

  5. 进入 NetworkMaterialCreate 节点(快捷键:选中时按 Ctrl+鼠标中键Ctrl+Enter ),创建 dlPrincipled 和 dlTexture 着色节点。

  6. 编辑 dlTexture 节点,并将纹理文件参数设置为{attr:geometry.arbitrary.basecolor.value} ;这将从先前设置的属性中读取文件路径。

    mceclip6.png

  7. 将 dlTexture 的 outputColor 端口连接到 dlPrincipled 节点的 Base > Color 端口的输入,然后退出 NetworkMaterialCreate(快捷键: Ctrl+Backspace )。

    mceclip7.png

  8. 选择除 Pony 节点之外的所有节点,然后按“M”键在下游创建合并节点。

    mceclip8.png

  9. 在 Merge 节点下方创建并连接 MaterialAssign 节点,添加值为/root/world/geo//*的自定义 CEL 引用,并将 materialAssign 参数设置为/root/materials/NetworkMaterial 。这将把材质应用到场景图中“geo”位置下方的所有位置。

    mceclip9.png

  10. 最后,在 MaterialAssign 的下游创建一个 GafferThree 节点,并从 Add 3Delight 菜单中添加一个环境光。

渲染时,您现在会看到使用同一材质为小马应用了两种不同的纹理。

mceclip10.png

延伸阅读

有关跨实例处理纹理的更多信息,请参阅: Q100508:使用分层(实例源)实例化提高场景图烹饪性能

附件

我们很遗憾听到

请告诉我们