マテリアル輪郭シェーダ

輪郭コントラストシェーダで輪郭を描画すべき位置を決定した後に、輪郭シェーダで輪郭のカラーと幅(さらにオプションでモーション、法線、マテリアル タグ、ラベル)を決定します。

シンプル

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
輪郭の幅です。

最大マテリアル カラー

このシェーダは、輪郭の両側の 2 つのマテリアルカラーの最大値を(それぞれのカラー バンドについて)取得します。

contour_shader_maxcolor
"contour_shader_maxcolor" (
    scalar          "width")
width
輪郭線の幅です。

曲率による幅

このシェーダは曲率(サーフェスの向きの相違)に応じて幅が決定される輪郭を描画します。2 つのサーフェス法線の角度が φ である場合、幅は計算式 ½(W−w)(1−cosφ)+w(w はパラメータ min_width、W はパラメータ max_width)を使用して計算されます。このため、2 つの法線がほぼ反対方向になっている場合は、輪郭の幅はこの 2 つの法線の間の max_width に近いものになります。2 つの法線の間の角度が小さくなると、輪郭の幅は狭くなり、min_width に近くなります(幅が完全に min_width と同じ値になることはありません。輪郭コントラスト機能では、サーフェスの曲率が ndelta 度よりも小さい場合には輪郭は作成されることはなく、輪郭がすべてのオブジェクトの内部に入りこまない限りndelta がゼロに設定されることもありません)。

深度の差が大きくなるオブジェクトのエッジでは、最大の輪郭幅が用いられます。論理的には、幅は角度 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
輪郭の幅(イメージ サイズのパーセントで指定)です。

たとえば、カラーがマテリアルの半分で幅が 2 パーセントの輪郭を作成するには、次のように指定します。

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

先ほどのシェーダと同じように、このシェーダでも半透明のマテリアルの背後にあるオブジェクトのカラーが考慮されます。

深度減衰による輪郭

ニアおよびファーのパラメータ セットを使用して指定された 2 つの値の間で、カラーと幅がリニアに補間される輪郭を描画します。輪郭のポイントが 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
最長距離よりも遠い場合の幅です。

たとえば、深度 -10 で幅 2 パーセントの赤と、深度 -25 で幅 1/2 パーセントの青との間で補間される輪郭を作成するには、次のように指定します。

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)

アニメートされた輪郭

このシェーダはフレーム番号にリニアに依存するカラーと幅を持つ輪郭を描きます。2 つのフレーム番号、カラー、幅が指定されます。フレーム番号が 1 つ目のフレーム番号より小さい場合、1 つ目のカラーと幅が使用されます。フレーム番号が 2 つ目のフレーム番号より大きい場合、2 つ目のカラーと幅が使用されます。フレーム番号が間にある場合、2 つのカラーと幅のリニア補間が用いられます。

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 つ下のレベルの(半透明の)マテリアルでは幅が 1 パーセント、2 つ下のレベルのマテリアルでは幅が 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
ライトに依存して輪郭の幅を減少するための最小係数を指定します。

たとえば、深度が -12 のときに幅が 2 パーセントの赤い輪郭と、深度が -18 のときに幅が 1 パーセントの青い輪郭との間を補間し、このマテリアル上のレイヤごとに幅を半減し、かつ光源 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.