輪郭コントラストシェーダで輪郭を描画すべき位置を決定した後に、輪郭シェーダで輪郭のカラーと幅(さらにオプションでモーション、法線、マテリアル タグ、ラベル)を決定します。
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 つのフレーム番号、カラー、幅が指定されます。フレーム番号が 1 つ目のフレーム番号より小さい場合、1 つ目のカラーと幅が使用されます。フレーム番号が 2 つ目のフレーム番号より大きい場合、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, 2015 NVIDIA ARC GmbH. All rights reserved.