ここでは、レイヤ シェーダを使って、直接 .mi フォーマットで作業する場合のレイヤの実行方法の例を示します。このシーンではチェッカー模様の環境に小さなおもちゃの馬が置かれています。2 つの mia_portal_light を「ライト カード」として使用して光線が当てられています。レイヤ シェーダを使用して物理的に正確な照明を使用することが推奨されますが、ポータル ライトはその目的にかなう優れたツールです。
また、適切なリニア カラー空間で作業するようにしてください。このイメージは標準的なコンピュータ モニタの表示用にガンマ 2.2 で補正され、mia_exposure_photographic を介してトーンマッピングされています。
テスト シーンは次のとおりで、最初に青く着色された mia_material を使用します。
shader "mia" "mia_material" (
"diffuse" 0.1 0.1 1.0,
"reflectivity" 1.0,
"refr_ior" 1.4,
"brdf_fresnel" on,
"mode" 2 # Use all lights
)
material "HorseMaterial"
= "mia"
shadow = "mia"
photon = "mia"
end material
次のようにレンダリングされます。
この mia_material をレイヤ シェーダに置き換えます。最初に外観が似ているオブジェクトを作成し、そこから先に進みます。
まず、最小限のノードを作成して単純な拡散反射を再現するところから始めます。mila_material node、mila_layer、および mila_diffuse_reflection を使用します。
# A default diffuse shader
shader "diffuse1" "mila_diffuse_reflection" ()
# Layers a single layer referring to our "diffuse1" shader above:
shader "my_layers1" "mila_layer" (
"layers" [
{
"shader" "diffuse1", # Our diffuse shader
"weight" 1, # Layer weight is 100% ...
"weight_tint" 1 1 1, # ...and weight tint is "white"
"on" on # ...and "on"
}
]
)
# The root node. Right now only accepts the layers above, and does nothing else
shader "root_node" "mila_material" (
"shader" "my_layers1"
)
# The material
material "HorseMaterial"
= "root_node"
shadow = "root_node"
photon = "root_node"
end material
レンダリングは次のように実行されます - 拡散反射する白い馬:
shader "diffuse1" "mila_diffuse_reflection" (
"tint" 0.1 0.1 1.0, # Added a color to our diffuse node
)
OKです。次に必要なものは反射です。このレイヤをコピーし、ただし代わりに反射レイヤを参照するだけにしたら、どうなるでしょうか。
shader "reflection1" "mila_specular_reflection" () shader "diffuse1" "mila_diffuse_reflection" ( "tint" 0.1 0.1 1.0, # Added a color to our diffuse node ) shader "my_layers1" "mila_layer" ( "layers" [ { "shader" "reflection1", # Our new reflection shader "weight" 1, # Layer weight is 100% ... "weight_tint" 1 1 1, # ...and weight tint is "white" "on" on # ...and "on" }, { "shader" "diffuse1", # Our old diffuse shader "weight" 1, # (same as before) "weight_tint" 1 1 1, "on" on } ] )
完全反射になってしまいました。なぜでしょうか?
その理由は、このレイヤ ノードの use_directional_weight が既定値のオフに設定されていて、ウェイトの付いた単純なレイヤを使用しているためです。mila_layer シェーダが対象レイヤすべてを上から下に処理していき、ウェイトを割り当てて、残ったウェイト(100% から対象レイヤのウェイトを引いたもの)を以下のレイヤに配分します。この反射レイヤは 100 % であるため、下方の拡散レイヤに残されているウェイトはありません(100 % - 100 % = 0 %)。
そうせずに、反射レイヤのウェイトを 50% に変更した場合、この最上位のレイヤに 50% が割り当てられ、次のレイヤにも 50% が割り当てられます(合計で 100%)。
"layers" [
{
"shader" "reflection1",
"weight" 0.5, # Changed weight to 0.5
"weight_tint" 1 1 1,
"on" on
},
...
2 つのレイヤが 50 対 50 で混合されています。これは、最上位レイヤに 50 % が設定され、残りが 50 % であるためです。この値は下位レイヤのウェイトによって乗算されます(この場合 100% 拡散レイヤのウェイトのみ)。
50%+50% の配合にするもう 1 つの方法は、mila_layer を mila_mix に置き換えることです。たとえば、両方のレイヤに対するウェイトを 100% に戻し、配合設定を既定にすると、クランプではなく正規化されます。両方のウェイトを 1 に設定すると、合計が 200% になります。正規化では、すべてのレイヤに対して半分(100%/200%)に下げて調整します。各レイヤに使用されるウェイトが 50% になります。これは、前のイメージとまったく同じレンダリング結果になります。
ただし、目標はあくまでコーティングを再現することであるため(mia_material の動作と同じ)、mila_layer を使用しますが、ここでは "use_directional_weight" をオンに設定しています。そこで次のように設定します。
"layers" [
{
"shader" "reflection1",
"weight" 1.0, # Returned to 1.0
"weight_tint" 1 1 1,
"use_directional_weight" on,
"directional_weight_mode" 0, # Turn on fresnel reflectivity
"ior" 1.4, # The fresnel index of refraction
"on" on
},
...
結果
このように、mia_material の場合とまったく同じ、実際の目的に合うものが作成できました。
これを、mia_material では実行できない領域を含め、さらに活用していきましょう。
最初に次の手順で「金属的」な外観を指定します。
最初に、既定から次のように反射シェーダを変更します。
shader "reflection1" "mila_glossy_reflection" (
"tint" 0.1 0.1 1.0, # Same as diffuse color
"roughness" 0.6" # Raise the roughness
)
次にそのレイヤの適用方法を変更します。
"layers" [
{
"shader" "reflection1",
"weight" 1.0,
"weight_tint" 1 1 1,
"use_directional_weight" on,
"directional_weight_mode" 1, # Switch to custom curve
"normal_reflectivity" 0.4, # Facing reflectivity
"grazing_reflectivity" 1.0, # Pretty much always 1.0,
"exponent" 5.0, # Pretty much always 5.0
"on" on
},
...
これにより、次のレンダリングが実行されます。
mia_material はまだ何も実行できません。しかし、これでちょっとしたメタリック光沢のあるマテリアルになりました。カー ペイントを実行する場合は、どうすればいいでしょうか。それには、最上位に別のクリアコート レイヤが必要です。レイヤ シェーダを使用すると、これは簡単です。
別の反射シェーダを追加してみましょう。レイヤの最上位に追加するだけです。
# A default reflection shader shader "reflection1_coat" "mila_specular_reflection" () shader "reflection1" "mila_glossy_reflection" ( "tint" 0.1 0.1 1.0, "roughness" 0.6 ) shader "diffuse1" "mila_diffuse_reflection" ( "tint" 0.1 0.1 1.0, ) shader "my_layers1" "mila_layer" ( "layers" [ { "shader" "reflection1_coat", "weight" 1, "weight_tint" 1 1 1, "use_directional_weight" on, "directional_weight_mode" 0, "ior" 1.4, "on" off }, { "shader" "reflection1", "weight" 1.0, "weight_tint" 1 1 1, "use_directional_weight" on, "directional_weight_mode" 1, "normal_reflectivity" 0.4, "grazing_reflectivity" 1.0, "exponent" 5.0, "on" on }, { "shader" "diffuse1", "weight" 1, "weight_tint" 1 1 1, "on" on } ] )
次の結果が得られます。
基本的には、カー ペイントを再作成しました。最上位が反射コーティングされた、色付きの拡散レイヤと色付きの反射レイヤです。
コーティング レイヤに光沢を追加するために、さらに別のレイヤを追加することも、同じくらい簡単です。
# Add another glossy shader shader "reflection1_coat2" "mila_glossy_reflection" ( "roughness" 0.2 ) ... "layers" [ { # Add it as another fresnel-weighted layer "shader" "reflection1_coat2", "weight" 1, "weight_tint" 1 1 1, "use_directional_weight" on, "directional_weight_mode" 0, "ior" 1.4, "on" on }, { ...
これは微妙に異なりますが、ハイライトの周りにブルーム効果が追加されます。
shader "top_material_diffuse" "mila_diffuse_reflection" ( "tint" 0.3 0.3 0.3 ) ... "layers" [ { "shader" "top_material_diffuse", "weight" 1.0, "weight_tint" = "noise_mask", # some texture mask "use_directional_weight" off, "on" on }, { ...
これにより次の結果が得られます。
このほうがレンダリングがさらに速くなります。その理由は、拡散グレーしか表示されないポイントに対してのみ拡散グレー シェーディングを実行するという高度な処理を、レイヤ化シェーダが行っているためです。単純な乗算ノードや加算ノードを使用してマテリアルがネイティブにミックスされている場合、これは当てはまりません。
また、このマスク テクスチャと一致するバンプ マップがある場合も、次のようにグレーの拡散レイヤに対する法線として適用することができます。
"layers" [
{
"shader" "top_material_diffuse",
"bump" = "noise_bump", # Some matching bump map
"weight" 1.0,
"weight_tint" = "noise_mask",
"use_directional_weight" off,
"on" on
},
{
...
これで、オブジェクト上のグレーの泥のように見えます。グレーの上にフレネル反射のレイヤを追加して、グレーのベトベトした流体に見えるようにしましょう。同じマスクとバンプ マスクを再利用したフレネル反射レイヤを使用するだけです。
# A default reflection shader shader "top_material_coat" "mila_specular_reflection" () ... "layers" [ { "shader" "top_material_coat", "bump" = "noise_bump", # Same bump map "weight" 1, "weight_tint" = "noise_mask", # Same mask "use_directional_weight" on, "directional_weight_mode" 0, "ior" 1.4, "on" on }, { ...
どうです。グレーのスライムができました。
もちろん、次のように最上位の拡散レイヤのウェイトを小さくして赤色に変更すると、イチゴジャムのように変更することができます。
shader "top_material_diffuse" "mila_diffuse_reflection" (
"tint" 0.2 0.02 0.02
)
...
...
{
"shader" "top_material_diffuse",
"bump" = "noise_bump",
"weight" 0.5,
"weight_tint" = "noise_mask",
"use_directional_weight" off,
"on" on
},
...
この変更により、次のようなレンダリングが得られます。
mila_* レイヤは論理的なものであり、物理的なものでないということを理解することが非常に重要です。つまり、基本レイヤを詳細に表示するには、それを覆うレイヤのウェイトを減らさなければならないということです。レイヤ自体を透明にしないでください。このようにすると、基本レイヤではなく、基本オブジェクトが表示されてしまいます。
ここでは、単純に拡散シェーダを既定の透明度シェーダに交換して、このテストを実行します。
shader "some_transparency" "mila_transparency" () ... ... { "shader" "some_transparency", # Swapped out diffuse for transparency "bump" = "noise_bump", "weight" 1.0, "weight_tint" = "noise_mask", "use_directional_weight" off, "on" on }, ...
次の結果が表示されます。
メタリックな青いペイント部分が所々にあるガラスのように見えることに注意してください。これは、透明度の方が青いペイント レイヤよりも論理的に上位にあり、ウェイトが大きくなると、青色よりも優先されるためです。
これは、たとえばカットアウトの透明度を決める機能として使用することができます。これは、可視性のカットアウトとは異なります。カットアウト部分の上に薄いガラスの馬が見えるため、ほとんど見えないモデルも依然としてシミュレートされています。
ただし、mila_material には可視性を入力する手段がないため、マテリアルで対象物の可視性をシミュレートすることはできません。言い換えると、カットアウトの不透明度マップを使用して、これを対象物が当たったこととみなすかどうかをコントロールすることができます。多くの場合、ツリーのリーフに対しカードの不透明度が同様に使用されます。深度バッファも正しく書き出され、さらにマット色も追加カラー スロットに書き出されます。次の図にその違いを示します。
shader "some_transparency" "mila_transparency" () ... ... { "shader" "top_material_coat", "bump" = "noise_bump", "weight" 1, "weight_tint" = "noise_mask", # Same mask "use_directional_weight" on, "directional_weight_mode" 0, "ior" 1.4, "on" off, # Turn off top coat ... "shader" "some_transparency" "bump" = "noise_bump", "weight" 1.0, "weight_tint" = "noise_mask", "use_directional_weight" off, "on" off, # Turn off transparency }, ... shader "root_node" "mila_material" ( "shader" "my_layers1", "visibility" = "inverted_noise_mask" #opacity rather than transparency )
これまでは、大きな単一のレイヤ ノードを使用して、すべての積み上げてきました。場合によっては、複数のレイヤ ノードを使用した方が簡単で便利なことがあります。たとえば、前述の「青のペイントの上の灰色のベトベト」に戻ってみましょう。
現在は次のようなレイヤ リストが作成されています(上から下の順)。
必要に応じて、これを 2 つのレイヤのノードに分割し、それらを、「灰色のベトベトの」マテリアルと「青いペイント」マテリアル間のミックスを行う 3 番目のレイヤ ノードに提供します。これによって、編成がより論理的になるため、レイヤをいくつも適用する代わりに、マスクとバンプを1 度適用するだけですみます。
階層的な方法で実行されたマテリアルの詳細なリストを次に示します。:
# This is the complete "gray goop" material
shader "top_material_coat" "mila_specular_reflection" ()
shader "top_material_diffuse" "mila_diffuse_reflection" ( "tint" 0.3 0.3 0.3 )
shader "top_layers" "mila_layer" (
"layers" [
{
"shader" "top_material_coat",
"weight" 1,
"weight_tint" 1 1 1,
"use_directional_weight" on, "directional_weight_mode" 0,
"ior" 1.4,
"on" on
},
{
"shader" "top_material_diffuse",
"weight" 1.0,
"weight_tint" 1 1 1,
"use_directional_weight" off,
"on" on
}
]
)
# This is the complete "blue paint" material
shader "reflection1_coat2" "mila_glossy_reflection" ( "roughness" 0.4 )
shader "reflection1_coat" "mila_specular_reflection" ()
shader "reflection1" "mila_glossy_reflection" ( "tint" 0.1 0.1 1.0, "roughness" 0.6 )
shader "diffuse1" "mila_diffuse_reflection" ( "tint" 0.1 0.01 1.0 )
shader "paint_layers1" "mila_layer" (
"layers" [
{
"shader" "reflection1_coat2",
"weight" 1,
"weight_tint" 1 1 1,
"use_directional_weight" on,
"directional_weight_mode" 0,
"ior" 1.4,
"on" on
},
{
"shader" "reflection1_coat",
"weight" 1,
"weight_tint" 1 1 1,
"use_directional_weight" on,
"directional_weight_mode" 0,
"ior" 1.4,
"on" on
},
{
"shader" "reflection1",
"weight" 1.0,
"weight_tint" 1 1 1,
"use_directional_weight" on,
"directional_weight_mode" 1,
"normal_reflectivity" 0.4,
"grazing_reflectivity" 1.0,
"exponent" 5.0,
"on" on
},
{
"shader" "diffuse1",
"weight_tint" 1 1 1,
"weight" 1,
"on" on
}
]
)
# This layers the two different materials together to create
# "gray goop covered blue paint"
shader "my_layers1" "mila_layer" (
"layers" [
{
"shader" "top_layers",
"bump" = "noise_bump", # Bump ONLY goes here
"weight_tint" = "noise_mask", # Mask ONLY goes here
"weight" 1,
"on" on
},
{
"shader" "paint_layers1",
"weight_tint" 1 1 1,
"weight" 1,
"on" on
}
]
)
生成されるレンダリングは、上と同じです。