在轮廓对比度着色器决定绘制轮廓的位置之后,轮廓着色器决定轮廓颜色和宽度,并根据需要决定运动、法线、材质标记和标签。
如果材质引用的是 contour_shader_simple 轮廓着色器,它会获得一个具有恒定颜色和宽度的简单着色器。
"contour_shader_simple" ( color "color", scalar "width")
即使轮廓对比度函数已确定对象内部或许还有轮廓,该着色器也只将轮廓放置在对象的轮廓处。
"contour_shader_silhouette" ( color "color", scalar "width")
该着色器采用轮廓每侧的两个材质颜色中的最大值(在每个色带中)。
"contour_shader_maxcolor" ( scalar "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" ( color "color", scalar "min_width", scalar "max_width")
使用 contour_shader_widthfromcolor 轮廓着色器,材质将获得厚度取决于材质颜色的轮廓。厚度取决于红色、绿色和蓝色色带中的最大 m。(如果 m 大于 1,它被钳制为 1。)宽度按照 (W−w)(1−m)+w 进行计算,其中,w 代表参数 min_width,W 代表参数 max_width。如果颜色明亮,则轮廓不可见;如果颜色较暗,则轮廓变宽。最小宽度用于明亮颜色,最大宽度用于黑色。
"contour_shader_widthfromcolor" ( color "color", scalar "min_width", scalar "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" ( scalar "factor", scalar "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" ( scalar "near_z", color "near_color", scalar "near_width", scalar "far_z", color "far_color", scalar "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" ( integer "frame1", color "color1", scalar "width1", integer "frame2", color "color2", scalar "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" ( color "color", scalar "min_width", scalar "max_width", light "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" ( color "color", scalar "min_width", scalar "max_width", vector "light_dir")
使用该轮廓着色器,轮廓宽度将随其上面的材质层数而变化。如果材质位于顶部,将由参数指定其轮廓宽度。对于其上面的每种材质,轮廓宽度将按因子(也可以通过参数控制)减小。
"contour_shader_layerthinner" ( color "color", scalar "width", scalar "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
该着色器是 depthfade、layerthinner 和 widthfromlight 轮廓着色器的组合。轮廓宽度将渐变融入到(从 near_width 到 far_width)背景中,颜色从 near_color 渐变为 far_color。轮廓宽度和颜色随距离 near_z 和 far_z 之间的渐变函数而变化。对于光线通过的每一层,要乘以一个因子以获得宽度。如果未指定因子,则宽度与层无关。如果已指定光源,则宽度还取决于相对于光源方向的曲面法线。
"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")
例如,若要获得这样的轮廓,即在 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.