Skip to content

合成材质


OctaneRender® 合成材质是 Octane 混合材质的高级版本。相比混合材质仅限于混合两种材质,合成材质允许您灵活设置并混合多种材质,生成单一的最终输出,同时严格遵循能量守恒原则。关于能量守恒的详细信息,请参阅相关说明
(合成材质是旧版本 Octane 中混合材质的重命名升级。)

注意
由于技术原因,合成材质必须使用“子材质”,不能与原始材质类型混用。


将混合材质转换为子材质

在 Cinema 4D 材质管理器中,选中混合材质,然后导航到实时查看器窗口 > 材质 > 转换材质,选择“转换材质”。系统会创建一个新的合成材质,并把原贡献材质转为子材质。


创建子材质

要从零创建子材质,请前往“节点编辑器 > 创建 > 子材质”菜单。这将在工作区新建一个子材质。或者,直接点击 Octane 节点编辑器中的子材质按钮并拖入工作区。

子材质按钮

下图为合成材质的基本设置界面:

合成材质设置

在上图中,首先“材质 1”和“材质 2”通过“材质蒙版”输入中的“浮点 1”纹理混合。如果“浮点 2”有值,会再次与“输入 1”和“输入 2”结果混合,最终与“输入 3”材质再混合。通过为蒙版插槽分配不同“浮点”纹理节点,可以灵活控制混合方式,且任何类型的纹理均可用作蒙版。


合成材质设置

在实时查看器的材质菜单中选择“合成材质”,即可在 Cinema 4D 材质管理器中新建合成材质。编辑时,在属性面板点击节点编辑器按钮。

composite material

材质数量

该选项用于设置要同时混合的材质数量。

材质插槽

可通过材质插槽右侧的复选框启用或禁用连接的子材质。当材质数量增加时,界面会自动生成新的材质插槽。

添加新插槽后,着色器球上方会出现对应标签。需将子材质分配至插槽。当选择暂未分配材质的标签时,将出现“添加材质”按钮,点击即可将子材质加入场景。

添加材质按钮

使用位移

位移贴图可与混合材质配合使用。您可通过“添加位移”选项应用任意灰度图或程序纹理。关于位移的详细内容,请参考这里

合成材质与位移

如上图所示,黄色与黑色条纹基座应用了合成材质。下方为对应材质节点示意:

composite Material example

此例共用三种子材质:

  • 一种用于深色条纹
  • 一种用于黄色条纹
  • 一种为带浅灰色的老化层

条纹本身是通过 OSL 着色器 生成,用作材质蒙版,并连接至第二、第三种材质的蒙版输入。位移节点连接到合成材质节点的“位移”输入。
条纹 OSL 着色器代码由 Microsoft CoPilot 生成,支持自定义条纹特征及方向。


条纹 OSL 着色器(Microsoft CoPilot 输出):

osl
shader soft_stripes_octane_color_pin(
    color stripe_color = color(1, 1, 1),
    color base_color = color(0, 0, 0),
    int stripe_count = 5,
    float stripe_width = 0.05,
    float blur_width = 0.02,
    float falloff_power = 1.0,
    float noise_amplitude = 0.01,
    color edge_mask = color(0.5) [[ string widget = "null" ]], // 可连接颜色输入
    float rotation = 0.0,
    float u_shift = 0.0,
    float v_shift = 0.0,
    output color Cout = 0
)
{
    float period = 1.0 / stripe_count;
    float clamped_stripe = clamp(stripe_width, 0.0, period * 0.5);
    float center_pos = period * 0.5;

    float angle = radians(rotation);
    float cu = cos(angle);
    float su = sin(angle);

    float shifted_u = u + u_shift;
    float shifted_v = v + v_shift;

    float u_local = shifted_u - 0.5;
    float v_local = shifted_v - 0.5;

    float rotated_u = cu * u_local - su * v_local + 0.5;

    float local = mod(rotated_u, period);
    float dist = abs(local - center_pos);

    float mask_val = luminance(edge_mask);  // 从连接的纹理获取灰度
    float noisy_dist = dist + (mask_val - 0.5) * 2.0 * noise_amplitude;

    float feather_zone = clamped_stripe * 0.5 + blur_width;
    float t = clamp(noisy_dist / feather_zone, 0.0, 1.0);
    float fade = pow(1.0 - t, falloff_power);

    Cout = mix(base_color, stripe_color, fade);
}

注意
合成纹理 不同,合成材质节点不支持子材质之间的传输模式,只提供基础蒙版(不透明度)功能。

OctaneRender® 和 OTOY® 是 OTOY Inc. 的注册商标