材质节点¶
Cycles在编译和运行时都应用了大量材质节点优化。利用它们可以设计复杂的 "超级材质" 风格的节点组,这些节点组为未使用的功能带来最少的渲染时间开销。
节点优化¶
作为准备节点着色器执行的第一步,Cycles展开全部的节点组,就像使用取消组工具,丢弃UI 只剩像框架和重新路由节点的特性。
此后,应用一些明显的变换。比如,它可以(这个列表不是详尽的)
替代下面的节点为它们评估的恒定结果,如果所有的它们的输入是确定不变的:
RGB,值,混合 RGB,数学,向量数学,RGB 到 BW,Gamma,明反差,反转,分离/组合 RGB/XYZ/HSV,黑体,RGB 曲线,向量曲线,颜色斜坡。
探测混合 RGB,数学和向量数学节点,这些变得没操作(没有夹具)或者作为与一个已知的常数0或1输入进行加、减、乘、除或内/外积的结果是0,并替代合适的输入链接或常数结果。
当用适当的输入值或链接替换,因子已知是0或1时,消除混合RGB混合(没有夹具)和混合材质节点。
Eliminate no-op Mix RGB (except Color Burn, Dodge, Lighten, or enabled Clamp), Invert, RGB Curves and Vector Curves nodes with known zero Factor.
消除发射和不发射任何光的背景材质节点,和一个或两个输入参数缺失的情况下添加材质节点。
消除具有不变的高度输入的凹凸,用它的法线输入或几何法线来代替。
组合有相同输入的相同节点的多个拷贝成一个实例。
最终,任何最终没有直接或间接连接到输出节点的节点被删除。
运行时优化¶
当执行着色器,一个特殊的优化被用于混合材质节点。如果因子评估是0或1,任何只有通过混合的未使用分支才可达的节点不被评估。
这可以本质上减少在一个具有顶点颜色,纹理,和其他输入作为交换的着色器内组合多种材质的运行消耗。
开放着色语言¶
如果开放着色语言被选作渲染后端,节点着色器被翻译成开放着色语言代码,然后编译,并通过 OSL 运行时执行。在这个过程,它应用自己的大量优化,包括编译时和运行时。
开放着色语言可以优化脚本节点,如果它们的输出未使用或不变的,即使它们的 OSL 着色器有令人困惑的调试追踪和消息传递的副作用。因此用 setmessage
和 getmessage
的消息传递一般不应该用作在图中向前传递消息;准确地讲,通过套接字 (sockets)传递消息更好。