创建支持服务单
关注

Q100170:处理Katana中的纹理

摘要

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

以下是与Arnold和RenderMan一起使用的一些选项的摘要。另请参阅附带的示例场景,该场景演示了此处介绍的两种方法。

更多信息

使用材质属性声明纹理

为每个对象提供自己的纹理的最简单方法是为每个对象创建一个材质,并在着色器中将纹理显式声明为字符串参数。然后为每个对象分配相关材料。

这种方法是最耗费人力的方法,尤其是在处理包含大量对象的场景时,并且在必须对材质进行更改时缺乏灵活性。

通常,许多对象可以共享相同的材质,但需要为其分配不同的纹理。在这种情况下,可以设置场景,以便每个对象拾取自己的纹理:

使用对象属性声明纹理

不是在材质上设置纹理,而是要渲染的对象可以通过任意属性指向相关的纹理文件。

RenderMan primvars

使用RenderMan时,纹理文件可以作为RenderMan primvar传递给渲染器。

在Katana中,任何名为 textures.xxx的 字符串属性 都会自动写入RenderMan,作为名为 xxx 的primvar 。如果着色器具有相同名称的字符串参数,RenderMan将使用从几何体传递给它的primvar的值,以在rendertime中设置此着色器参数。

如果纹理的名称包含在几何体上的任意属性中,则可以使用OpScript以 RenderMan可识别的格式 设置这些 texture.xxx 属性。

要使用RenderMan primvars设置示例场景,请执行以下操作:

  1. 单击“ 帮助”>“我想要一匹小马”, 添加CameraCreate和两个Pony节点 。确保列出小马的名字。
  2. 使用AttributeSet节点创建属性“geometry.arbitrary.texFile”。在其中一个小马上设置为'flag_uk.tx',在另一个小马上设置为'flag_usa.tx'。
  3. 使用Merge节点合并所有节点。
  4. 创建材质并向其添加RMSGPS表面着色器。
  5. 使用MaterialAssign节点将材质指定给root / world / geo // *。
  6. 使用PxrStdAreaLight添加GafferThree节点。
  7. 现在创建将处理纹理的OpScript节点。
    - 将其应用于自定义CEL位置:/ root / world / geo // *。这意味着OpScript将以递归方式应用于geo下的所有对象。
    - 添加名为texturePath的用户参数,并将值设置为存储Katana中包含的演示的纹理的位置,例如
    在Linux或Linux上 /opt/Foundry/Katana2.5v3/demos/tx_files/
    C:/ Program Files / Katana2.5v3 / demos / tx_files / 在Windows上
    - 添加以下lua代码:
    local texPath = Interface.GetOpArg('user.texturePath')
    local fileName = Interface.GetAttr('geometry.arbitrary.texFile')
    local filePath =(texPath:getValue().. fileName:getValue())

    Interface.SetAttr('textures.SurfaceMap',StringAttribute(filePath))



  8. 渲染这个,您将看到为每个小马分配了由geometry.arbitrary.texFile指定的纹理。

要在Katana中查看参数的内部名称(如本例中的SurfaceMap),可以将鼠标中键拖动到“脚本编辑器”的文本字段中。生成的命令将告诉您要用于属性的名称。

要获取有关如何将包含纹理的名称或文件路径的标记添加到geometry.arbitrary的更多信息,请参阅有关 使用管道数据设置纹理 的Katana在线帮助

着色器参数的{attr:xxx}语法

另一个适用于Arnold和Renderman的选项是使用着色器参数的{attr:xxx}语法。这可以通过在创建材质时将材质的任何参数设置为{attr:tex.SurfaceMap}来实现。

在渲染时,渲染器将在要渲染的几何体上查找名为tex.SurfaceMap的属性。然后,着色器参数将设置为从几何属性中读取的值。

对于这种方法,像上面的例子中描述的那样设置场景,但添加{attr:tex.SurfaceMap}作为Surface Map参数的值(不是纹理。以表明我们没有使用primvars),并更改OpScript代码的最后一行

Interface.SetAttr('tex.SurfaceMap',StringAttribute(filePath))

有关详细信息,请参阅 Katana在线帮助中 的“纹理处理 - 概述”示例项目和 纹理处理选项 部分。

这篇文章有帮助吗?

我们很遗憾听到

请告诉我们
4 人中有 1 人觉得有帮助

评论