概括
着色器库和工作室管线以各种不同的方式处理纹理, Katana提供了一个灵活的框架来分配纹理,遵循一些常见的约定。
以下概述了适用于 3Delight、RenderMan 和 Arnold 渲染器的部分选项。另请参阅附件中的示例场景,其中演示了本文所述的两种方法。
更多信息
使用材质属性来声明纹理
为每个对象赋予独立纹理的最简单方法是为每个对象创建一个材质,并在着色器中将纹理显式声明为字符串参数。然后,将相应的材质分配给每个对象。
这种方法最费力,尤其是在处理包含大量对象的场景时,而且在需要更改材质时缺乏灵活性。
通常情况下,许多物体可以共享相同的材质,但需要赋予不同的纹理。在这种情况下,可以设置场景,使每个物体都拥有自己的纹理:
使用对象属性声明纹理
与其在材质上设置纹理,不如让要渲染的对象通过任意属性指向相关的纹理文件。
Katana中的用户数据和原始变量
渲染器允许使用用户数据或图元变量,这些数据可供着色器查找。在Katana中,约定是将任意几何数据读取为名为geometry.arbitrary.xxx的属性,然后默认情况下,这些属性也会作为用户数据或图元变量写入渲染器。这意味着,如果您使用图元变量或用户数据来指定纹理,则可以自动完成此操作。
在Katana中使用 RenderMan 时,可以使用 primvars 来声明纹理。
RenderMan提供了一种跨实例处理纹理的方法,即在实例位置解析着色器参数语法,具体实现方式是使用RenderMan 的 ` <primstr:attributename>` 语法。然而,此功能仅在 RenderMan 24 版本中引入。
创建示例场景
以下步骤说明如何使用对象属性在 3Delight 渲染器中声明纹理。
- 从“帮助”>“我想要一个小马”菜单中添加一个 CameraCreate 节点、一个 NetworkMaterialCreate 节点和两个 Pony 节点。请务必更改每个 Pony 节点的名称参数,使其唯一。
-
在每个 Pony 的下游创建一个 AttributeSet 节点,并将路径设置为相应上游 Pony 的场景图位置。
-
编辑每个 AttributeSet 节点,并将每个 attributeName 参数更改为 'geometry.arbitrary.basecolor.value',将 type 参数更改为 'string'。
-
将每个属性集的 stringValue 设置为指向一个唯一的纹理文件。您可以在Katana自带的
$KATANA_ROOT/demos/tx_files/目录下找到示例文件,或者您也可以使用本文中附带的纹理文件。 -
进入 NetworkMaterialCreate 节点(快捷键:选中时按 Ctrl+鼠标中键或Ctrl+Enter ),创建 dlPrincipled 和 dlTexture 着色节点。
-
编辑 dlTexture 节点,并将纹理文件参数设置为
{attr:geometry.arbitrary.basecolor.value};这将从先前设置的属性中读取文件路径。 -
将 dlTexture 的 outputColor 端口连接到 dlPrincipled 节点的 Base > Color 端口的输入,然后退出 NetworkMaterialCreate(快捷键: Ctrl+Backspace )。
-
选择除 Pony 节点之外的所有节点,然后按“M”键在下游创建合并节点。
-
在 Merge 节点下方创建并连接 MaterialAssign 节点,添加值为
/root/world/geo//*的自定义 CEL 引用,并将 materialAssign 参数设置为/root/materials/NetworkMaterial。这将把材质应用到场景图中“geo”位置下方的所有位置。 - 最后,在 MaterialAssign 的下游创建一个 GafferThree 节点,并从 Add 3Delight 菜单中添加一个环境光。
渲染时,您现在会看到使用同一材质为小马应用了两种不同的纹理。
延伸阅读
有关跨实例处理纹理的更多信息,请参阅: Q100508:使用分层(实例源)实例化提高场景图烹饪性能
附件
我们很遗憾听到
请告诉我们