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(基質)を提供します。

images/pxrLM/PxrLMDiffuse.png

デフォルト設定のLMDiffuse(青みがかったフロントカラーを除く)

以下の画像は、粘土のようなマテリアルを作成するために、デフォルトのパラメータ設定を修正して作成しました:

images/pxrLM/PxrLMDiffuse_specLayer_clay.png
images/pxrLM/PxrLMDiffuse_clay1Graph.png

Shading Graph

以下の画像も、粘土のようなマテリアルを作成するために、デフォルトのパラメータ設定を修正して作成しましたが、カラーバリエーションやスペキュラーの粗度をブレンドしています:

images/pxrLM/PxrLMDiffuse_specLayer_clay_specRoughnessDiff.png
images/pxrLM/PxrLMDiffuse_clay2Graph.png

Shading Graph

PxrLMSubsurface

サブサーフェスのベースマテリアルです。スペキュラーおよびクリアコートは、デフォルトで無効です。

images/pxrLM/PxrLMSubsurface.png

追加設定なしのマテリアルのデフォルトを使用したPxrLMSubsurface

デフォルトのパラメータ設定は、人間のスキンですが、PxrLMSubsurfaceを使用すると、大理石やワックスコーティング付きのチーズのようなサブサーフェススキャッタリングのマテリアルも作成することができます。

PxrLMMetal

金属のベースマテリアルです。プリセットが用意されているため、以下のようなクロムメッキのようなマテリアルもPxrLMMetalを使用して簡単に作成することができます。

images/pxrLM/PxrLMMetal.png

また、Shading Tangentを使用すると、つや消し金属のマテリアルを作成したり、PxrLMLayerでペイントのレイヤを追加することができます:

images/pxrLM/PxrLMMetal_shadingTangent.png
images/pxrLM/PxrLMMetal_brushedMetalGraph.png

つや消し金属のShading Graph

images/pxrLM/PxrLMMetal_paintLayer.png
images/pxrLM/PxrLMMetal_paintOnMetalGraph.png

金属上にペイントを追加したShading Graph

PxrLMPlastic

プラスチックのsubstrate(基質)です。これは、他のタイプのマテリアルに使用できます。

images/pxrLM/PxrLMPlastic.png

デフォルト設定のPxrLMPlastic(緑のDiffuse Color以外)

このプラスチックのsubstrate(基質)を使用して、白熱光のカラーを設定すると、白熱光を放つマテリアルを作成することもできます。 このサンプルでは、スペキュラーカラーを0に設定することで、スペキュラーも無効にしています。 光を放つマテリアルではスペキュラーの反応は不要であるという判断からです。 これは、"フェイク"な放射であることに注意してください。

images/pxrLM/PxrLMPlastic_incandescence.png
PxrLMGlass

PxrLMGlassは、ガラスのようなベースマテリアルです。これは、ゼラチンや半透明プラスチックのような、屈折性のある他のマテリアルの作成にも使用することができます。

このsubstrate(基質)は屈折を使用するため、最大スペキュラーデプスを大きくすることが重要です。 以下の左側にある画像は、デフォルトのパラメータのPxrLMGlassで作成しました。 ティーポットの内部が非常に暗くなっていることに注意してください。 これは、指定したスペキュラーデプス/バウンスが不十分なためです。 右側の画像は、Specular Depthを6に増加させた場合の結果です。

images/pxrLM/PxrLMGlass_noAttr.png

デフォルト設定

images/pxrLM/PxrLMGlass_withAttr.png

Specular Depth = 6

シャドウをThinに変更すると、ティーポットのシャドウは、"薄い"ガラスのシャドウのようになり、ライトがより通過しやすくなります。 ティーポットの底部の暗い領域がなくなったことがわかります。 このサンプルでは、興味深いルックにするために、屈折カラーに色付けも行ないました。 "薄い"シャドウが物理的に正確ではないことに注意してください。

images/pxrLM/PxrLMGlass_thinShadow.png

以下の左側の画像のように、粗度を大きくすることで、ガラスの屈折にブラーをかけることができます。 屈折にもブラーがかかっていることに注意してください。 反射をはっきりさせても、レイヤの使用による屈折ブラーは保持できます。 PxrLMLayerを追加して、substrate(基質)から入射する反射をオフにすると、substrate(基質)で反射カラーを0に設定することができます。 substrate(基質)に少し反射カラーを残すことで、画像を改善することができます。 以下の右側の画像では暗い部分は見られません。

images/pxrLM/PxrLMGlass_soft.png
images/pxrLM/PxrLMGlass_softRefr_sharpReflect.png

Material Layering(マテリアルのレイヤ化)

PxrLMLayerはオプションです。 substrate(基質)のローブを上書き/修正するためにレイヤを作成する必要がある場合のみ、PxrLMLayerを使用します。 PxrLMLayerはベースマテリアルの加算ではないという理解が重要です。 その代わり、PxrLMLayerはベースマテリアルのパラメータにブレンドされます。 これは、技術的にはPatternノードで、ブレンドされたパラメータによるBxdfコールは1つだけです。 PxrLMLayerは、別のPxrLMLayerに接続することができます。

以下の画像は、PxrLMLayerのいろいろな使用例です。 左側の画像では、ディフューズカラーを修正し、レイヤマスクを1に設定していますので、 substrate(基質)のディフューズカラーが完全に上書きされています。 右側の画像では、レイヤのマスクを0に設定して、レイヤを無効にしています。これは、デバッグの目的で最も役立つことがあります。 尚、これは、substrate(基質)の設定の上書きを停止する簡単な方法です。

images/pxrLM/PxrLMDiffuse_layerMask1.png

layerMask = 1

images/pxrLM/PxrLMDiffuse_layerMask0.png

layerMask = 0

以下の画像では、マスクを使用して、レイヤとsubstrate(基質)のブレンドについて説明しています。 左側の画像では、レイヤから20%を使用しているため、ベースレイヤからの寄与がより多くなります。 右側の画像では、80%を使用してるため、ベースレイヤからの寄与はあまり見えません。

images/pxrLM/PxrLMDiffuse_layerMaskpt2.png

layerMask = .2

images/pxrLM/PxrLMDiffuse_layerMaskpt8.png

layerMask = .8

以下の画像では、レイヤを使用したローブの上書きについて説明しています。 このサンプルでは、スペキュラーを上書きしています。 左側の画像では、1番目のレイヤが表示され、粗いスペキュラーが表れています(ディフューズカラーは0に設定しているため、スペキュラーでの変化を確認することができます)。 右側の画像は、よりはっきりしたスペキュラーを表す2番目のレイヤです(1番目のレイヤのスペキュラーの挙動をオフにしているため、2番目のレイヤのスペキュラーローブのみを確認しています)。

images/pxrLM/PxrLMDiffuse_layer_bigSpecRough.png
images/pxrLM/PxrLMDiffuse_layer_smallSpecRough.png

次に、以下の画像のように、両方のレイヤでレイヤマスクを1に設定すると、一番上のレイヤが優先されることがわかります。

images/pxrLM/PxrLMDiffuse_layer_smallSpecRough.png

レイヤとバンプ

以下の画像は、レイヤを使用してディフューズバンプを上書きした例です。

images/pxrLM/PxrLMDiffuse_baseBump.png

Diffuse Bumpを使用したPxrLMDiffuse

images/pxrLM/PxrLMDiffuse_layer1Bump.png

Different Diffuse Bumpを使用したPxrLMLayer

images/pxrLM/PxrLMDiffuse_layerMask.png

PxrLMLayerのLayer Mask

images/pxrLM/PxrLMDiffuse_withLayer1Bump.png

PxrLMLayer Bumpを使用したPxrLMDiffuse

images/pxrLM/PxrLMDiffuse_layerBumpGraph.png

Shading Graph


Layer Combining(レイヤ結合)

PxrLMMixerによりレイヤを結合することができます。 2つ以上のPxrLMLayerがある場合、どちらかのPxrLMMixerを使用して、それらを結合することができます。 パラメータは、一番上の入力から下へ結合されます。 それぞれのPxrLMMixerは、最大5つのレイヤをサポートしますが、PxrLMLayerのように、Mixerノードを入れ子化して、追加レイヤの結合をサポートすることができます。



付録:RIBサンプル

PxrLMDiffuseサンプル

images/pxrLM/PxrLMDiffuse.png

デフォルト設定のLMDiffuse(青みがかったフロントカラーを除く)。

RIB Declaration:

# Using default settings with a different frontColor
  Bxdf "PxrLMDiffuse" "diffuseOnlyMaterial" "color frontColor" [0.00062709 0.153578 0.337242]
    
images/pxrLM/PxrLMDiffuse_specLayer_clay.png

粘土

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"]
    
images/pxrLM/PxrLMDiffuse_specLayer_clay_specRoughnessDiff.png

カラー/スペキュラーが変化した粘土

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サンプル

images/pxrLM/PxrLMSubsurface.png

PxrLMSubsurface

RIB Declaration:

Bxdf "PxrLMSubsurface" "subsurfaceMaterial"
    

PxrLMMetalサンプル

images/pxrLM/PxrLMMetal.png

クロムめっき

RIB Declaration:

Bxdf "PxrLMMetal" "chrome"
    
images/pxrLM/PxrLMMetal_shadingTangent.png

つや消し金属

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"]
    
images/pxrLM/PxrLMMetal_paintLayer.png

クロムめっき上のペイント

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サンプル

images/pxrLM/PxrLMPlastic.png

緑のプラスチック

RIB Declaration:

Bxdf "PxrLMPlastic" "plastic" "color diffuseColor" [0.000952557 0.139168 0.00209999]
    
images/pxrLM/PxrLMPlastic_incandescence.png

白熱したプラスチック

RIB Declaration:

Bxdf "PxrLMPlastic" "plastic" "reference color incandescence" ["emissive_PxrExposure:resultRGB"]
     "color specularColor" [0 0 0]
    

PxrLMGlassサンプル

images/pxrLM/PxrLMGlass_noAttr.png

デフォルトのガラス

RIB Declaration:

Bxdf "PxrLMGlass" "glass"
    
images/pxrLM/PxrLMGlass_withAttr.png

Specular Depth = 6のガラス

RIB Declaration:

Attribute "trace" "constant int maxspeculardepth" [6]
Attribute "visibility" "constant int transmission" [1] "constant int indirect" [1]
Bxdf "PxrLMGlass" "glass"
    
images/pxrLM/PxrLMGlass_thinShadow.png

"薄い"ガラス

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]
    
images/pxrLM/PxrLMGlass_soft.png

ブラーがかかった屈折が見られるガラス

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]
    
images/pxrLM/PxrLMGlass_softRefr_sharpReflect.png

ブラーがかかった屈折とはっきりした反射が見られるガラス

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サンプル

images/pxrLM/PxrLMDiffuse_layerMask1.png

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"]
    
images/pxrLM/PxrLMDiffuse_layerMask0.png

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"]
    
images/pxrLM/PxrLMDiffuse_layerMaskpt2.png

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"]
    
images/pxrLM/PxrLMDiffuse_layerMaskpt8.png

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"]
    
images/pxrLM/PxrLMDiffuse_layer_bigSpecRough.png

レイヤマテリアル:レイヤには粗いスペキュラーを追加、ディフューズの寄与なし

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"]
    
images/pxrLM/PxrLMDiffuse_layer_smallSpecRough.png

上図と同じマテリアルで、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"]
    
images/pxrLM/PxrLMDiffuse_layer_smallSpecRough.png

同じマテリアルで、両方のレイヤには 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"]