輪郭コントラストシェーダで輪郭を描画すべき位置を決定した後に、輪郭シェーダで輪郭のカラーと幅(さらにオプションでモーション、法線、マテリアル タグ、ラベル)を決定します。
contour_shader_simple 輪郭シェーダを参照しているマテリアルには、一定のカラーおよび幅のシンプルな輪郭が作成されます。
"contour_shader_simple" ( color "color", scalar "width")
このシェーダはオブジェクトのシルエットにのみ輪郭を作成します(輪郭コントラスト機能によってオブジェクトの内部にも輪郭を作成すると決定された場合でも)。
"contour_shader_silhouette" ( color "color", scalar "width")
このシェーダは、輪郭の両側の 2 つのマテリアルカラーの最大値を(それぞれのカラー バンドについて)取得します。
"contour_shader_maxcolor" ( scalar "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" ( 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")
たとえば、カラーがマテリアルの半分で幅が 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" ( scalar "near_z", color "near_color", scalar "near_width", scalar "far_z", color "far_color", scalar "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" ( 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 つ下のレベルの(半透明の)マテリアルでは幅が 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 )
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")
たとえば、深度が -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