着色节点#

Cycles在编译和运行时都应用了大量材质节点优化。利用它们可以设计复杂的 超级材质 风格的节点组,这些节点组为未使用的功能带来最少的渲染时间开销。

节点优化#

作为准备节点着色器执行的第一步,Cycles展开全部的节点组,就像使用取消组工具,丢弃UI 只剩像框架和重新路由节点的特性。

此后,应用一些明显的变换。比如,它可以(这个列表不是详尽的):

  • 替代下面的节点为它们评估的恒定结果,如果所有的它们的输入是确定不变的:

    RGB、值、混合 RGB、运算、矢量运算、去色、伽玛、亮度对比度、反色、分离/合并 RGB/XYZ/HSV、黑体、RGB 曲线、矢量曲线、颜色渐变。

  • 探测混合 RGB,数学和向量数学节点,这些变得没操作(没有夹具)或者作为与一个已知的常数0或1输入进行加、减、乘、除或内/外积的结果是0,并替代合适的输入链接或常数结果。

  • 当用适当的输入值或链接替换,因子已知是0或1时,消除混合RGB混合(没有夹具)和混合材质节点。

  • 消除无操作混合RGB(除了颜色加深,颜色减淡,变亮,或启用钳制),反转,RGB曲线和具有已知0系数的矢量曲线节点。

  • 消除发射和不发射任何光的背景材质节点,和一个或两个输入参数缺失的情况下添加材质节点。

  • 消除 隆起 的恒定高度输入,使用其法线输入或几何法线代替。这对于实现节点组输入很有用,这些节点组在做数学运算之前通过无操作的凹凸路由来默认为法向。

  • Replace Attribute nodes of the View Layer type with the evaluated attribute value (it is constant within the whole Render Layer).

  • 组合有相同输入的相同节点的多个拷贝成一个实例。

最终,最终没有直接或间接连接到输出节点的节点将被删除。

运行时优化#

当执行着色器,一个特殊的优化被用于混合材质节点。如果因子评估是0或1,任何只有通过混合的未使用分支才可达的节点不被评估。

这可以大大降低在一个着色器中将多个材质与用作开关的颜色属性、纹理或其他输入组合在一起的性能成本。

开放着色语言#

If Open Shading Language is chosen as the rendering backend, node shaders are translated to OSL code and then compiled and executed by the OSL runtime. In the process it applies its own extensive set of optimizations, both at compile time and run-time.

开放着色语言可以优化脚本节点,如果它们的输出未使用或不变的,即使它们的 OSL 着色器有令人困惑的调试追踪和消息传递的副作用。因此用 setmessagegetmessage 的消息传递一般不应该用作在图中向前传递消息;准确地讲,通过插口 (sockets)传递消息更好。