A Practical Guide to PxrLM
A Practical Guide to PxrLM
PxrLM:設計原理
PxrLMマテリアルインターフェースは、並外れた大きなインターフェースを提供するというよりは、拡張性や柔軟性、堅牢性を損なうことなく、シンプルに設計されています。 その設計により、マテリアルは、驚くほどすばらしいルックを作成するのに必要な最小限のパラメータセットを提供します。 各パラメータは、"高速に駆動させ、且つ安全"に使用できるように、注意深く実装/微調整されています。 超高速なターンアラウンドタイムを生み出す能力は、プロダクションでは重要な意味を持ち、PxrLMマテリアルは、この目標に配慮して設計されています。
PxrLM:システム
PxrLMシステムは、3つのカテゴリに分けられるノードから成ります:
Base Materials(Substrates:基質)
"substrate(基質)"は、単なるベースマテリアルです。 以下のsubstrate(基質)には、特定のタイプの共通マテリアルを作成するために調整されたデフォルトのマテリアルパラメータがあります。 これらのマテリアルパラメータを調整すれば、他のタイプのマテリアルを作成する時に使用することができます。 PxrLMマテリアルは融通が利くため、金属マテリアルをプラスチックマテリアルに変えても壊れません。
探しているマテリアルが以下に見つからない場合、既存のsubstrate(基質)のパラメータ調整によりそれを変更することができます。 もしくは、PxrLMのsubstrate(基質)に基づいて、独自のsubstrate(基質)を書くこともできます。
PxrLMDiffuse
ディフューズのみのsubstrate(基質)です。これは、PxrLMLayerでスペキュラーを追加して他のマテリアルを構築する場合に使用する基本的なsubstrate(基質)を提供します。
デフォルト設定のLMDiffuse(青みがかったフロントカラーを除く)
以下の画像は、粘土のようなマテリアルを作成するために、デフォルトのパラメータ設定を修正して作成しました:
|
Shading Graph |
以下の画像も、粘土のようなマテリアルを作成するために、デフォルトのパラメータ設定を修正して作成しましたが、カラーバリエーションやスペキュラーの粗度をブレンドしています:
Shading Graph
PxrLMSubsurface
サブサーフェスのベースマテリアルです。スペキュラーおよびクリアコートは、デフォルトで無効です。
追加設定なしのマテリアルのデフォルトを使用したPxrLMSubsurface
デフォルトのパラメータ設定は、人間のスキンですが、PxrLMSubsurfaceを使用すると、大理石やワックスコーティング付きのチーズのようなサブサーフェススキャッタリングのマテリアルも作成することができます。
PxrLMMetal
金属のベースマテリアルです。プリセットが用意されているため、以下のようなクロムメッキのようなマテリアルもPxrLMMetalを使用して簡単に作成することができます。
また、Shading Tangentを使用すると、つや消し金属のマテリアルを作成したり、PxrLMLayerでペイントのレイヤを追加することができます:
つや消し金属のShading Graph
金属上にペイントを追加したShading Graph
PxrLMPlastic
プラスチックのsubstrate(基質)です。これは、他のタイプのマテリアルに使用できます。
デフォルト設定のPxrLMPlastic(緑のDiffuse Color以外)
このプラスチックのsubstrate(基質)を使用して、白熱光のカラーを設定すると、白熱光を放つマテリアルを作成することもできます。 このサンプルでは、スペキュラーカラーを0に設定することで、スペキュラーも無効にしています。 光を放つマテリアルではスペキュラーの反応は不要であるという判断からです。 これは、"フェイク"な放射であることに注意してください。
PxrLMGlass
PxrLMGlassは、ガラスのようなベースマテリアルです。これは、ゼラチンや半透明プラスチックのような、屈折性のある他のマテリアルの作成にも使用することができます。
このsubstrate(基質)は屈折を使用するため、最大スペキュラーデプスを大きくすることが重要です。 以下の左側にある画像は、デフォルトのパラメータのPxrLMGlassで作成しました。 ティーポットの内部が非常に暗くなっていることに注意してください。 これは、指定したスペキュラーデプス/バウンスが不十分なためです。 右側の画像は、Specular Depthを6に増加させた場合の結果です。
デフォルト設定 |
Specular Depth = 6 |
シャドウをThinに変更すると、ティーポットのシャドウは、"薄い"ガラスのシャドウのようになり、ライトがより通過しやすくなります。 ティーポットの底部の暗い領域がなくなったことがわかります。 このサンプルでは、興味深いルックにするために、屈折カラーに色付けも行ないました。 "薄い"シャドウが物理的に正確ではないことに注意してください。
以下の左側の画像のように、粗度を大きくすることで、ガラスの屈折にブラーをかけることができます。 屈折にもブラーがかかっていることに注意してください。 反射をはっきりさせても、レイヤの使用による屈折ブラーは保持できます。 PxrLMLayerを追加して、substrate(基質)から入射する反射をオフにすると、substrate(基質)で反射カラーを0に設定することができます。 substrate(基質)に少し反射カラーを残すことで、画像を改善することができます。 以下の右側の画像では暗い部分は見られません。
|
|
Material Layering(マテリアルのレイヤ化)
PxrLMLayerはオプションです。 substrate(基質)のローブを上書き/修正するためにレイヤを作成する必要がある場合のみ、PxrLMLayerを使用します。 PxrLMLayerはベースマテリアルの加算ではないという理解が重要です。 その代わり、PxrLMLayerはベースマテリアルのパラメータにブレンドされます。 これは、技術的にはPatternノードで、ブレンドされたパラメータによるBxdfコールは1つだけです。 PxrLMLayerは、別のPxrLMLayerに接続することができます。
以下の画像は、PxrLMLayerのいろいろな使用例です。 左側の画像では、ディフューズカラーを修正し、レイヤマスクを1に設定していますので、 substrate(基質)のディフューズカラーが完全に上書きされています。 右側の画像では、レイヤのマスクを0に設定して、レイヤを無効にしています。これは、デバッグの目的で最も役立つことがあります。 尚、これは、substrate(基質)の設定の上書きを停止する簡単な方法です。
layerMask = 1 |
layerMask = 0 |
以下の画像では、マスクを使用して、レイヤとsubstrate(基質)のブレンドについて説明しています。 左側の画像では、レイヤから20%を使用しているため、ベースレイヤからの寄与がより多くなります。 右側の画像では、80%を使用してるため、ベースレイヤからの寄与はあまり見えません。
layerMask = .2 |
layerMask = .8 |
以下の画像では、レイヤを使用したローブの上書きについて説明しています。 このサンプルでは、スペキュラーを上書きしています。 左側の画像では、1番目のレイヤが表示され、粗いスペキュラーが表れています(ディフューズカラーは0に設定しているため、スペキュラーでの変化を確認することができます)。 右側の画像は、よりはっきりしたスペキュラーを表す2番目のレイヤです(1番目のレイヤのスペキュラーの挙動をオフにしているため、2番目のレイヤのスペキュラーローブのみを確認しています)。
|
|
次に、以下の画像のように、両方のレイヤでレイヤマスクを1に設定すると、一番上のレイヤが優先されることがわかります。
レイヤとバンプ
以下の画像は、レイヤを使用してディフューズバンプを上書きした例です。
Diffuse Bumpを使用したPxrLMDiffuse |
Different Diffuse Bumpを使用したPxrLMLayer |
PxrLMLayerのLayer Mask |
PxrLMLayer Bumpを使用したPxrLMDiffuse |
Shading Graph
Layer Combining(レイヤ結合)
PxrLMMixerによりレイヤを結合することができます。 2つ以上のPxrLMLayerがある場合、どちらかのPxrLMMixerを使用して、それらを結合することができます。 パラメータは、一番上の入力から下へ結合されます。 それぞれのPxrLMMixerは、最大5つのレイヤをサポートしますが、PxrLMLayerのように、Mixerノードを入れ子化して、追加レイヤの結合をサポートすることができます。
関連項目
付録:RIBサンプル
PxrLMDiffuseサンプル
デフォルト設定のLMDiffuse(青みがかったフロントカラーを除く)。
RIB Declaration:
# Using default settings with a different frontColor
Bxdf "PxrLMDiffuse" "diffuseOnlyMaterial" "color frontColor" [0.00062709 0.153578 0.337242]
粘土
RIB Declaration:
# Displacement bound and turn on trace displacement
Attribute "displacementbound" "constant float sphere" [0.5]
Attribute "trace" "constant int displacements" [1]
# specular only layer
Pattern "PxrLMLayer" "claySpec_PxrLMLayer" "int diffuseBehavior" [0]
"color specularColor" [0.1 0.1 0.1] "float specularRoughness" [0.2]
"color specularEta" [1.553 1.553 1.553]
# fractal for clay color mix
Pattern "PxrFractal" "clay_PxrFractal" "float frequency" [1]
Pattern "PxrMix" "clayColor_PxrMix" "color color1" [0.528296 0.187493 0.0699699]
"color color2" [0.551763 0.195495 0.0728056]
"reference float mix" ["clay_PxrFractal:resultF"]
# diffuse only bxdf
Bxdf "PxrLMDiffuse" "clay_PxrLMDiffuse"
"reference struct lmlayer" ["claySpec_PxrLMLayer:result"]
"reference color frontColor" ["clayColor_PxrMix:resultRGB"]
# clay displacement
Displacement "RMSDisplacement" "uniform float displacementAmount" [0.02]
"uniform float displacementCenter" [0]
"reference float displacementScalar"
["clay_fractal:resultF"]
カラー/スペキュラーが変化した粘土
RIB Declaration:
# Displacement bound and turn on trace displacement
Attribute "displacementbound" "constant float sphere" [0.5]
Attribute "trace" "constant int displacements" [1]
# clay color manifold
Pattern "PxrManifold2D" "clayColor_PxrManifold2D"
"float scaleS" [1] "float scaleT" [10]
Pattern "PxrFractal" "clayDisp_PxrFractal" "float frequency" [1]
Pattern "PxrFractal" "clayColor_PxrFractal" "float frequency" [1]
"reference struct manifold" ["clayColor_PxrManifold2D:result"]
# clay specular blend
Pattern "PxrBlend" "claySpecRoughness_PxrBlend"
"int operation" [10]
"color topRGB" [0.05 0.05 0.05]
"color bottomRGB" [0.2 0.2 0.2]
"reference float topA" ["clayColor_PxrFractal:resultF"]
# clay color mix
Pattern "PxrMix" "clayColor_PxrMix"
"color color1" [0.528296 0.187493 0.0699699]
"color color2" [0.800144 0.391712 0.218277]
"reference float mix" ["clayColor_PxrFractal:resultF"]
# specular only layer
Pattern "PxrLMLayer" "claySpec_PxrLMLayer" "int diffuseBehavior" [0]
"color specularColor" [0.1 0.1 0.1]
"reference float specularRoughness" ["claySpecRoughness_PxrBlend:resultR"]
"color specularEta" [1.553 1.553 1.553]
# clay Bxdf
Bxdf "PxrLMDiffuse" "clay_PxrLMDiffuse"
"reference struct lmlayer" ["claySpec_PxrLMLayer:result"]
"reference color frontColor" ["clayColor_PxrMix:resultRGB"]
# clay displacement
Displacement "RMSDisplacement" "uniform float displacementAmount" [0.02]
"uniform float displacementCenter" [0]
"reference float displacementScalar" ["clayDisp_PxrFractal:resultF"]
PxrLMSubsurfaceサンプル
PxrLMSubsurface
RIB Declaration:
Bxdf "PxrLMSubsurface" "subsurfaceMaterial"
PxrLMMetalサンプル
クロムめっき
RIB Declaration:
Bxdf "PxrLMMetal" "chrome"
つや消し金属
RIB Declaration:
Pattern "PxrManifold2D" "rotationAngleVector_PxrManifold2D"
"float scaleS" [20] "float scaleT" [20]
Pattern "PxrTexture" "rotationAngleVector_PxrTexture"
"string filename" ["aniso_vec_circles.tex"]
"reference struct manifold" ["rotationAngleVector_PxrManifold2D:result"]
Pattern "PxrTangentField" "brushedMetal_PxrTangentField"
"reference color inputVector" ["rotationAngleVector_PxrTexture:resultRGB"]
Bxdf "PxrLMMetal" "brushedMetal_PxrLMMetal" "color eta" [2.36763 1.66336 1.46706]
"color kappa" [4.49884 3.05016 2.34543]
"float roughness" [0.5]
"float anisotropy" [-0.99]
"color specularColor" [0.902094 0.462061 0.321606]
"reference vector shadingTangent" ["brushedMetal_PxrTangentField:resultXYZ"]
クロムめっき上のペイント
RIB Declaration:
Pattern "PxrManifold3D" "flake_PxrManifold3D" "float scale" [0.5]
Pattern "PxrFlakes" "metalPaintMask_PxrFlakes" "float flakeFreq" [5]
"float size" [1] "reference struct manifold" ["flake_PxrManifold3D:result"]
Pattern "PxrLMLayer" "paintLayer_PxrLMLayer"
"color diffuseColor" [0.00217329 0.0204367 0.971155]
"color specularColor" [0.645431 0.71656 0.996728]
"float specularRoughness" [0.15]
"reference float layerMask" ["metalPaintMask_PxrFlakes:resultA"]
"reference normal diffuseNn" ["metalPaintMask_PxrFlakes:resultN"]
"reference normal specularNn" ["metalMask_PxrFlakes:resultN"]
Bxdf "PxrLMMetal" "paintOnMetal" "reference struct lmlayer" ["paintLayer_PxrLMLayer:result"]
PxrLMPlasticサンプル
緑のプラスチック
RIB Declaration:
Bxdf "PxrLMPlastic" "plastic" "color diffuseColor" [0.000952557 0.139168 0.00209999]
白熱したプラスチック
RIB Declaration:
Bxdf "PxrLMPlastic" "plastic" "reference color incandescence" ["emissive_PxrExposure:resultRGB"]
"color specularColor" [0 0 0]
PxrLMGlassサンプル
デフォルトのガラス
RIB Declaration:
Bxdf "PxrLMGlass" "glass"
Specular Depth = 6のガラス
RIB Declaration:
Attribute "trace" "constant int maxspeculardepth" [6]
Attribute "visibility" "constant int transmission" [1] "constant int indirect" [1]
Bxdf "PxrLMGlass" "glass"
"薄い"ガラス
RIB Declaration:
Attribute "trace" "constant int maxspeculardepth" [6]
Attribute "visibility" "constant int transmission" [1] "constant int indirect" [1]
Bxdf "PxrLMGlass" "glass" "color reflectionColor" [0.4891 0.7303 0.7759]
"color refractionColor" [0.9 0.9 0.9]
"int shadows" [1]
ブラーがかかった屈折が見られるガラス
RIB Declaration:
Attribute "trace" "constant int maxspeculardepth" [6]
Attribute "visibility" "constant int transmission" [1] "constant int indirect" [1]
Bxdf "PxrLMGlass" "glass" "color reflectionColor" [0.4891 0.7303 0.7759]
"color refractionColor" [0.9 0.9 0.9]
"int shadows" [1]
"float roughness" [0.3]
ブラーがかかった屈折とはっきりした反射が見られるガラス
RIB Declaration:
Attribute "trace" "constant int maxspeculardepth" [6]
Attribute "visibility" "constant int transmission" [1] "constant int indirect" [1]
Pattern "PxrLMLayer" "sharpReflection" "int diffuseBehavior" [0]
"int clearcoatBehavior" [0]
"int specularBehavior" [1]
"float specularRoughness" [0.01]
Bxdf "PxrLMGlass" "glass" "color reflectionColor" [0 0 0]
"color refractionColor" [0.963798 0.0301911 0.0637397]
"float roughness" [0.2]
"reference struct lmlayer" ["sharpReflection_PxrLMLayer:result"]
PxrLMLayerサンプル
layerMask = 1のPxrLMLayer
RIB Declaration:
Pattern "PxrLMLayer" "overrideDiffuse" "color diffuseColor" [0 0.5 0.5]
"int specularBehavior" [0]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0.5 0 0]
"reference struct lmlayer" ["overrideDiffuse:result"]
layerMask = 0のPxrLMLayer
RIB Declaration:
Pattern "PxrLMLayer" "overrideDiffuse" "float layerMask" [0]
"color diffuseColor" [0 0.5 0.5] "int specularBehavior" [0]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0.5 0 0]
"reference struct lmlayer" ["overrideDiffuse:result"]
layerMask = .2 (レイヤの20%がsubstrate:基質とブレンドされています)
RIB Declaration:
Pattern "PxrLMLayer" "overrideDiffuse" "float layerMask" [0.2]
"color diffuseColor" [0 0.5 0.5] "int specularBehavior" [0]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0.5 0 0]
"reference struct lmlayer" ["overrideDiffuse:result"]
layerMask = .8 (レイヤの80%がsubstrate:基質とブレンドされています)
RIB Declaration:
Pattern "PxrLMLayer" "overrideDiffuse" "float layerMask" [0.8]
"color diffuseColor" [0 0.5 0.5] "int specularBehavior" [0]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0.5 0 0]
"reference struct lmlayer" ["overrideDiffuse:result"]
レイヤマテリアル:レイヤには粗いスペキュラーを追加、ディフューズの寄与なし
RIB Declaration:
Pattern "PxrLMLayer" "overrideSpec1" "int diffuseBehavior" [0]
"int specularBehavior" [1] "color specularColor" [1 0 0]
"float specularRoughness" [0.3]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0 0 0]
"color backColor" [0 0 0] "reference struct lmlayer" ["overrideSpec1:result"]
上図と同じマテリアルで、2番目のレイヤにはっきりしたスペキュラーを追加
RIB Declaration:
Pattern "PxrLMLayer" "overrideSpec2" "int diffuseBehavior" [0]
"int specularBehavior" [1] "color specularColor" [0 1 0]
"float specularRoughness" [0.05]
Pattern "PxrLMLayer" "overrideSpec1" "int diffuseBehavior" [0]
"int specularBehavior" [0] "color specularColor" [1 0 0]
"float specularRoughness" [0.3] "reference struct lmlayer" ["overrideSpec2:result"]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0 0 0]
"color backColor" [0 0 0] "reference struct lmlayer" ["overrideSpec1:result"]
同じマテリアルで、両方のレイヤには layerMask = 1を設定。トップのレイヤが優先されます!
RIB Declaration:
Pattern "PxrLMLayer" "overrideSpec2" "int diffuseBehavior" [0]
"int specularBehavior" [1] "color specularColor" [0 1 0]
"float specularRoughness" [0.05]
Pattern "PxrLMLayer" "overrideSpec1" "int diffuseBehavior" [0]
"int specularBehavior" [1] "color specularColor" [1 0 0]
"float specularRoughness" [0.3] "reference struct lmlayer" ["overrideSpec2:result"]
Bxdf "PxrLMDiffuse" "layerMaterial" "color frontColor" [0 0 0]
"color backColor" [0 0 0] "reference struct lmlayer" ["overrideSpec1:result"]
