マテリアル輪郭シェーダ

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

シンプル

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φ)+ww はパラメータ 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)+ww はパラメータ 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 つずつ指定します。フレーム番号が最初のフレーム番号よりも小さい場合は、最初のカラーおよび幅が使用されます。フレーム番号が最後のフレーム番号よりも大きい場合は、最後のカラーおよび幅が使用されます。フレーム番号がその中間である場合は、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φ)+ww はパラメータ 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-2009 by mental images GmbH