材质轮廓着色器

在轮廓对比度着色器决定绘制轮廓的位置之后,轮廓着色器决定轮廓颜色和宽度,并根据需要决定运动、法线、材质标记和标签。

简单

如果材质引用的是 contour_shader_simple 轮廓着色器,它会获得一个具有恒定颜色和宽度的简单着色器。

contour_shader_simple
"contour_shader_simple" (
    color           "color",
    scalar          "width")
color
轮廓的颜色。
width
轮廓的宽度,以图像宽度的百分比表示。百分比允许不更改相对轮廓宽度而对图像进行缩放。

轮廓

即使轮廓对比度函数已确定对象内部或许还有轮廓,该着色器也只将轮廓放置在对象的轮廓处。

contour_shader_silhouette
"contour_shader_silhouette" (
    color           "color",
    scalar          "width")
color
轮廓线的颜色。
width
轮廓的宽度。

最大材质颜色

该着色器采用轮廓每侧的两个材质颜色中的最大值(在每个色带中)。

contour_shader_maxcolor
"contour_shader_maxcolor" (
    scalar          "width")
width
轮廓线的宽度。

曲率相关宽度

该着色器绘制的轮廓的宽度取决于曲率(曲面方向的差)。如果 φ 是两个曲面法线之间的角度,则宽度按公式 ½ (W - W) (1 - cosφ) + W 进行计算,其中,w 代表参数 min_width,W 代表参数 max_width。因此,如果两条法线的方向几乎相反,则存在宽度接近法线间 max_width 的轮廓。如果法线之间的角度减小,则轮廓的宽度也逐渐减小,最终接近于 min_width。(宽度永远都不会完全达到 min_width,因为轮廓对比度函数不会创建任何曲面曲率小于 N 增量度数的轮廓,而且如果不获取所有对象内部的轮廓,也不能将 N 增量设定为零。)

对象边缘的深度差较大,因此使用最大轮廓宽度。理论上,最小宽度出现在 0 度,最大宽度出现在 180 度。

contour_shader_curvature
"contour_shader_curvature" (
    color           "color",
    scalar          "min_width",
    scalar          "max_width")
color
轮廓的颜色。
min_width
最小轮廓宽度,以图像大小的百分比表示。
max_width
最大轮廓宽度,以图像大小的百分比表示。

颜色相关宽度

使用 contour_shader_widthfromcolor 轮廓着色器,材质将获得厚度取决于材质颜色的轮廓。厚度取决于红色、绿色和蓝色色带中的最大 m。(如果 m 大于 1,它被钳制为 1。)宽度按照 (W−w)(1−m)+w 进行计算,其中,w 代表参数 min_width,W 代表参数 max_width。如果颜色明亮,则轮廓不可见;如果颜色较暗,则轮廓变宽。最小宽度用于明亮颜色,最大宽度用于黑色。

contour_shader_widthfromcolor
"contour_shader_widthfromcolor" (
    color           "color",
    scalar          "min_width",
    scalar          "max_width")
color
轮廓的颜色。
min_width
最小轮廓宽度,以图像大小的百分比表示。
max_width
最大轮廓宽度,以图像大小的百分比表示。

例如,若要获得宽度较大处材质位于阴影中,宽度较小处材质被照亮的黑色轮廓,请指定以下命令:

contour "contour_shader_widthfromcolor" (
    "color"         0 0 0 1,  # solid black
    "min_width"     0.5,      # min width
    "max_width"     1.5)      # max width

请注意,对于半透明材质,材质颜色不只是处于给定照明中的对象材质的颜色;材质后的对象颜色也包含在内。

来自材质颜色的颜色

该着色器在绘制轮廓时,轮廓颜色与对应的对象的颜色相匹配,只有亮度不同(通常暗得多)。

contour_shader_factorcolor
"contour_shader_factorcolor" (
    scalar          "factor",
    scalar          "width")
factor
材质颜色的倍增。如果 factor 为 0,将形成黑色轮廓。如果 factor 介于 0 和 1 之间,将形成黑色轮廓(与材质的色调相同)。如果 factor 为 1,将形成与该点处的材质具有相同颜色的轮廓。如果 factor 大于 1,将形成与材质具有相同色调的明亮轮廓。
width
轮廓宽度,以图像大小的百分比表示。

例如,若要获得材质颜色的一半且百分之二宽度的轮廓,请指定以下命令:

contour "contour_shader_factorcolor" (
    "factor"        0.5,      # factor of material color
    "width"         2.0)      # contour width (in %)

与前面的着色器的类似,此着色器考虑半透明材质后的对象颜色。

深度淡出轮廓

绘制轮廓时,在近距和远距参数集指定的两个值之间对其颜色和宽度进行线性插值。如果某个轮廓点比 far_z 远,则轮廓的颜色为 far_color,宽度为 far_width。如果某个点比 near_z 近,则轮廓的颜色为 near_color,宽度为 near_width。如果深度介于两者之间,则对颜色和宽度进行线性插值。

contour_shader_depthfade
"contour_shader_depthfade" (
    scalar          "near_z",
    color           "near_color",
    scalar          "near_width",
    scalar          "far_z",
    color           "far_color",
    scalar          "far_width")
near_z
最小距离。
near_color
等于和小于最小距离时的颜色。
near_width
等于和小于最小距离时的宽度。
far_z
最大距离。
far_color
等于和小于最大距离时的颜色。
far_width
等于和小于最大距离时的宽度。

例如,若要获得在 2% 宽、红色、深度为 -10 和 0.5% 宽、蓝色、深度为 -25 之间进行插值的轮廓,请指定以下命令:

contour "contour_shader_depthfade" (
    "near_z"        -10,
    "near_color"    1 0 0 1,
    "near_width"    2,
    "far_z"         -25,
    "far_color"     0 0 1 1,
    "far_width"     0.5)

动画轮廓

该着色器可绘制其颜色和宽度以线性方式取决于帧编号的轮廓。会指定两个帧编号、颜色和宽度。如果帧编号小于第一个帧编号,则使用第一个颜色和宽度。如果帧编号大于最后一个帧编号,则使用最后一个颜色和宽度。如果帧编号介于两者之间,则使用两种颜色和宽度的线性插值。

contour_shader_framefade
"contour_shader_framefade" (
    integer         "frame1",
    color           "color1",
    scalar          "width1",
    integer         "frame2",
    color           "color2",
    scalar          "width2")
frame1
最小帧编号。
color1
等于和小于最小帧编号时的颜色。
width1
等于和小于最小帧编号时的宽度。
frame2
最大帧编号。
color2
等于和小于最大帧编号时的颜色。
width2
等于和小于最大帧编号时的宽度。

在以下示例中,轮廓在第 3 帧之前为完全不透明,且呈白色,然后逐渐消失直到第 10 帧。第 10 帧后,轮廓为完全透明。

contour "contour_shader_framefade" (
    "frame1"        3,
    "color1"        1 1 1 1,
    "width1"        1,
    "frame2"        10,
    "color2"        0 0 0 0,
    "width2"        0.2)

来自灯光方向的宽度

绘制轮廓时,其宽度取决于曲面法线与光源方向之间的角度 φ。宽度按照公式 ½(W−w)(1−cosφ)+w 进行计算,其中,w 代表参数 min_width,W 代表参数 max_width。因此,厚度会从 min_width(曲面直接面向灯光方向时)逐渐增大到 max_width(曲面与灯光方向完全相反时)。

contour_shader_widthfromlight
"contour_shader_widthfromlight" (
    color           "color",
    scalar          "min_width",
    scalar          "max_width",
    light           "light")
color
轮廓线的颜色。
min_width
轮廓的最小宽度。
max_width
轮廓的最大宽度。
light
灯光。

例如,考虑以下情况:光源的名称为 light_0。若要获得这样的黑色轮廓,即 2% 宽(曲面远离光源)逐渐减小到零宽度(曲面直接面向光源),请指定以下命令:

contour "contour_shader_widthfromlight" (
    "color"         0 0 0 1,       # contour color
    "min_width"     0.0,           # min width (%)
    "max_width"     2.0,           # max width (%)
    "light"         "light_0")     # light name

来自灯光方向的宽度

此着色器是前一个着色器的变体。它直接接受方向,而不是隐式提供方向的灯光。

contour_shader_widthfromlightdir
"contour_shader_widthfromlightdir" (
    color           "color",
    scalar          "min_width",
    scalar          "max_width",
    vector          "light_dir")
color
轮廓线的颜色。
min_width
轮廓的最小宽度。
max_width
轮廓的最大宽度。
light_dir
主光源的方向。

来自层的宽度

使用该轮廓着色器,轮廓宽度将随其上面的材质层数而变化。如果材质位于顶部,将由参数指定其轮廓宽度。对于其上面的每种材质,轮廓宽度将按因子(也可以通过参数控制)减小。

contour_shader_layerthinner
"contour_shader_layerthinner" (
    color           "color",
    scalar          "width",
    scalar          "factor")
color
轮廓线的颜色。
width
顶层轮廓的宽度。
factor
用于将每层的轮廓变窄的因子。

例如,若要获得这样的红色轮廓,即材质位于顶部时为 2% 宽,材质位于另一(半透明)材质后时为 1% 宽,材质位于两种材质之后时为 0.5% 宽,依此类推,请使用以下命令:

contour "contour_shader_layerthinner" (
   "color"         1 0 0 1,       # contour color
   "width"         2.0,           # width at top layer (%)
   "factor"        0.5)           # factor pr. layer

组合

该着色器是 depthfadelayerthinnerwidthfromlight 轮廓着色器的组合。轮廓宽度将渐变融入到(从 near_width 到 far_width)背景中,颜色从 near_color 渐变为 far_color。轮廓宽度和颜色随距离 near_z 和 far_z 之间的渐变函数而变化。对于光线通过的每一层,要乘以一个因子以获得宽度。如果未指定因子,则宽度与层无关。如果已指定光源,则宽度还取决于相对于光源方向的曲面法线。

contour_shader_combi
"contour_shader_combi" (
    scalar          "near_z",
    color           "near_color",
    scalar          "near_width",
    scalar          "far_z",
    color           "far_color",
    scalar          "far_width",
    scalar          "factor",
    light           "light",
    scalar          "light_min_factor")
near_z
最小距离。
near_color
等于和小于最小距离时的颜色。
near_width
等于和小于最小距离时的宽度。
far_z
最大距离。
far_color
等于和小于最大距离时的颜色。
far_width
等于和小于最大距离时的宽度。
factor
用于将每层的轮廓变窄的因子。若未定义,表示禁用层依存关系。
light
光源;若未定义,表示无灯光依存关系。
light_min_factor
指定灯光依存关系减小轮廓宽度的最小因子。

例如,若要获得这样的轮廓,即在 2% 宽、红色、深度为 -12 和 1% 宽、蓝色、深度为 -18 之间插值,并为此材质上方的每层材质获取宽度的一半(宽度还依赖于名为 mylight 的光源的方向),请指定以下命令:

contour "contour_shader_combi" (
                                  # interpolate from
   "near_z"        -12,           # this depth,
   "near_color"    1 0 0 1,       # color (red),
   "near_width"    2,             # and width (in %)
                                  # to
   "far_z"         -18,           # this depth
   "far_color"     0 0 1 1,       # color (blue)
   "far_width"     1,             # and width (in %).
                                  # optional:
   "factor"        0.5,           # factor pr. layer
   "light"         "mylight",     # light name
   "light_min_factor" 0.5)

Copyright © 1986, 2015 NVIDIA ARC GmbH. All rights reserved.