SLI Zone

NVIDIA.com Gelato Zone Home
 
Download the free version

Mango 如何工作:着色器调用
  — John Schlag

Mango 可以按照两种方式处理它以前从未遇到的着色器。您可以通过 Mango 自定义着色器,也可以添加 Maya 着色器实现程序。

要通过 Mango 自定义着色器,请参阅用户手册中的覆盖着色器。简单说来,这提供了一个取代或与 Maya 内置着色器一道使用 GSL 中所写Gelato着色器的方法。

至于第二点 - Maya 着色器的实现 - 这么做有二个优点。首先,Mango 配备有与 Maya 匹配的着色器集合,但有些缺失。您可能需要自己填补其中一个空白。(如果您要这样做,请让我们知道。我们可能会在未来版本中包括这一新的着色器。)第二,您或其他人可能已经编写了 Maya 着色器插件,当然 Mango 以前从未遇到。要在 Gelato 中获得这一新的着色器渲染,您需要一些 GSL 或 DSO shadeop 的组合。

要了解这些是如何工作的,让我们退后一步,看一下 Mango 是如何处理着色器的。

Mango 部分的设计摘要是它应能处理内置的 Maya 着色器和用户可能想要在 GSL 中写的任何自定义着色器。在满足此要求的情况下,Mango 需要能够:

  • 打开任何着色器 .gso 文件(我们的或你们的)
  • 获得着色器参数的列表
  • 找到 Maya 节点上符合的属性
  • 写未连接属性的值(不论是否会变动)
  • 最后,找到与“上游”纹理的连结,并做同样的工作。

当然,Mango 也会将自定义着色器参数的 U.I. 项添加到 Attribute Editor(属性编辑器)。这会使自定义着色器看起来尽可能像内置着色器。您可以像过去在 Maya 中那样,编辑参数,制作它们的动画或纹理。

由于 Mango 必须为自定义着色器完成所有这一切,因此,也需要使用相同的代码来处理内置着色器。这是很重要的一点:Mango 插件几乎一点也不了解 Maya 的内置着色器。 这可能听起来很奇怪,但却是真的:Mango 的 Maya 着色器是用 GSL 写的,因此它们与您写的任何着色器具有相同的脚点(footing)。换一种方式说:您的着色器是一流的居民(citizen)。

如果您已经写了新的着色器,并且它利用 gslc 正确地编辑,请确保被编辑的 .gso 文件位于着色器搜索路径内的某个位置(检查在 Gelato Render Globals 中设置的 "string path:shader" 属性)。之后,Mango 会找到它,并按照上面所述处理它。

要写 Maya 模拟着色器 - 或匹配自定义 Maya 着色器插件 - 只需确保着色器参数名称与 Maya 着色器节点上的属性名称相符。

除此之外,还有一些小窍门。Gelato 并非能够处理所有类型的 Maya 属性,因此 Mango 可以帮上一点忙。

  • 在 GSL 中成为保留字的任何参数/属性可以有一个下划线 (_) 的前缀。例如,其中一个最流行的着色器参数名称是“color”。因此,GSL 参数名称是“_color”。
  • 信息属性是用字符串写的,包含有所连接节点的名称。(这是 shadingSwitch 节点如何工作的一部分。)
  • 对于 Gelato 2.1,GSL 支持可变长度阵列。但是,在以前的版本中,对于一些混合属性的复杂案例,Mango 仍就支持着色器参数到阵列元素的影射:下线丝 (_) 变成了句点 (.),"_n" 变成了 "[n]"。例如,input_3_alpha 变成 input[3].alpha
  • 在 GSL 中没有 struct,Maya 的一些属性是 struct 的属性阵列。例如,tripleShadingSwitch 的input 属性会在 GSL 中写做“struct { color inTriple; string inShape; } input[]”。而着色器参数就是“color inTriple[]" and "string inShape[]”。一旦 Mango 找到一个阵列参数的相符 Maya 属性,而该属性不是一个阵列,则 Mango 会检查其上一级,查看上一级属性是否是阵列。
  • 有些着色器分两块实现。尽管 2.1 版本的 Gelato 按照命令驱动的顺序执行着色器,但还没有将参数传递到上游着色器的显式机制。例如,在写一个 maya_projection 的着色器调用时,Mango 会先查找 maya_projection_pre.gso,在通过上游连接之前为它写一个着色器调用, 之后再使用maya_projection.gso的着色器。"pre" 着色器通常会计算其它着色器使用的纹理坐标。Mango 也很乐意为您的着色器写一个 "pre" 着色器。

所有这一切表示,您有完全的灵活性来使用 Mango 的 Maya 模拟着色器及自定义着色器。您甚至可以在单个着色图中将它们混合使用。实际上,任何节点都可以被覆盖,只要它有 gelatoShader 字符串属性,尽管只有表面着色器 - lambert、blinn、phong 等 - 具有用于它的用户界面。