Mia_material をエミュレートする

前のページで説明したように、mia_material の反射動作を正確にエミュレートすることができます。実際問題として、ほぼすべての側面をシミュレートすることができ、ほとんどの設定の mia_material の動作を模倣するようにフェノメナを作成することができます。

これが可能になった理由は、mia_material に機能をオンまたはオフする複数のスイッチが用意されていることです。通常これは、異なるレイヤ設定を使ってシミュレートする必要があります。たとえば、mia_material は thin_walled モードがオンかオフかで本質的に異なる動作をします。レイヤ化シェーダに関して、この thin_walled オプションは mila_material に対して作用します。また、カットアウト機能は、可視性として実装されていますが、特定のレイヤが透明をコンポーネントとして持っている場合があります。

次に、mia_material にそっくりの動作をする mia_material_emulator という名前のフェノメナを一覧します。

これは、mia_material のようなものを作ろうと思えば作れるということの例に過ぎません。レイヤ シェーダを直接使用する方が最適なことが多いですが、既存の mia_materials をミックスすることが望ましい場合があり、そのような場合に役立ちます。

declare phenomenon
    color "mila_layer_mia_material" (
        scalar  "diffuse_weight"      default 1.0, #: min 0.0 max 1.0
        color   "diffuse"             default 0.5 0.5 0.5,
        scalar  "diffuse_roughness"   default 0.0, #: min 0.0 max 1.0

        scalar  "reflectivity"        default 0.6, #: min 0.0 max 1.0
        color   "refl_color"          default 1.0 1.0 1.0,
        scalar  "refl_gloss"          default 1.0, #: min 0.0 max 1.0
        scalar  "refl_gloss_quality"  default 1.0, #: min 0.0 softmax 4.0

        scalar  "transparency"        default 0.0, #: min 0.0 max 1.0
        color   "refr_color"          default 1.0 1.0 1.0,
        scalar  "refr_gloss"          default 1.0, #: min 0.0 max 1.0
        scalar  "refr_ior"            default 1.4, #: min 0.1 softmax 2.0
        scalar  "refr_gloss_quality"  default 1.0, #: min 0.0 softmax 4.0
        boolean "refr_translucency"   default off,
        color   "refr_trans_color"    default 0.7 0.6 0.5,
        scalar  "refr_trans_weight"   default 0.5, #: min 0.0 max 1.0

        scalar  "anisotropy"          default 1.0, #: min 0.1 softmax 10
        scalar  "anisotropy_rotation" default 0.0, #: softmin 0 softmax 1
        integer "anisotropy_channel"  default -1,  #: min -1  softmax 64

        integer "brdf_fresnel_mode"    default 1,  #Custom curve (aka manual), while 0 Fresnel uses refr_ior
        scalar  "brdf_0_degree_refl"   default 0.2, #: min 0.0 max 1.0
        scalar  "brdf_90_degree_refl"  default 1.0, #: min 0.0 max 1.0
        scalar  "brdf_curve"           default 5.0, #: min 0.1 softmax 20

        # Reflection/Refraction optimizations & falloffs

        boolean  "refl_falloff_on"       default off,
        scalar   "refl_falloff_dist"     default 0.0,
        boolean  "refl_falloff_color_on" default off,
        color    "refl_falloff_color"    default 0 0 0,

        boolean  "refr_falloff_on"       default off,
        scalar   "refr_falloff_dist"     default 0.0,
        boolean  "refr_falloff_color_on" default off,
        color    "refr_falloff_color"    default 0 0 0,

        # Factors

        scalar   "indirect"              default 1.0,  #: min 0 softmax 1.0

        # Built in AO
        
        scalar   "quality"        default 1.0,          #: min 0.0 softmax 2.0

        # Only one bump input
        vector   "overall_bump"
    )
    
    shader "refl_roughness" "mila_get_roughness" ("glossiness" = interface "refl_gloss")
    # Reflections
    shader "reflection" "mila_glossy_reflection" (
        "roughness"       = "refl_roughness",
        "quality"         = interface "refl_gloss_quality",

        "anisotropy"      = interface "anisotropy",
        "aniso_angle"     = interface "anisotropy_rotation",
        "aniso_channel"   = interface "anisotropy_channel",
        
        "use_max_dist"       = interface "refl_falloff_on",
        "max_dist"           = interface "refl_falloff_dist",
        "use_max_dist_color" = interface "refl_falloff_color_on",
        "max_dist_color"     = interface "refl_falloff_color",
    )

    shader "refr_roughness" "mila_get_roughness" ("glossiness" = interface "refr_gloss")    
    # Refractions
    shader "refraction" "mila_glossy_transmission" (
        "roughness"       = "refr_roughness",
        "quality"         = interface "refr_gloss_quality",
        "ior"             = interface "refr_ior",
        
        "anisotropy"      = interface "anisotropy",
        "aniso_angle"     = interface "anisotropy_rotation",
        "aniso_channel"   = interface "anisotropy_channel",
        
        "use_max_dist"       = interface "refr_falloff_on",
        "max_dist"           = interface "refr_falloff_dist",
        "use_max_dist_color" = interface "refr_falloff_color_on",
        "max_dist_color"     = interface "refr_falloff_color"        

    )

    # Translucency
    shader "translucency" "mila_diffuse_transmission" (
        "tint"            = interface "refr_trans_color",
        "indirect"        = interface "indirect_multiplier"
    )    

    # Diffuse
    shader "diffuse" "mila_diffuse_reflection" (
        "roughness"        = interface "diffuse_roughness",
        "indirect"         = interface "indirect_multiplier",
        "quality"          = interface "quality"
    )

    # Transparency and Translucency live in a 
    # separate "sub layers" because they steal
    # energy from eachother

    shader "transmission" "mila_layer" (
        "layers" [
            {
                "shader" "translucency",
                "weight_tint" 1 1 1,
                "weight"  = interface "refr_trans_weight",
		"use_directional_weight" off,
                "on"      = interface "refr_translucency"
            },
            {
                "shader" "refraction",
                "weight_tint" 1 1 1, 
                "weight" 1,
		"use_directional_weight" off,
                "on" on
            }
        ]
    )

    #
    # The main layers, mimicking mia_materials
    # energy conservation logic
    #

    shader "mia_layers" "mila_layer" (
        "layers" [
            {
                "shader" "reflection",   # Reflection layer
                "weight_tint"          = interface "refl_color",
                "bump"                 = interface "overall_bump",
                "weight"               = interface "reflectivity",
		"use_directional_weight" on,
                "directional_weight_mode" = interface "brdf_fresnel_mode",
                "normal_reflectivity"  = interface "brdf_0_degree_refl",
                "grazing_reflectivity" = interface "brdf_90_degree_refl",
                "exponent"             = interface "brdf_curve",
                "ior"                  = interface "refr_ior",
                "on" on
            },
            {
                "shader" "transmission", # Transparency+Translucency
                "bump"                 = interface "overall_bump",
                "weight_tint"          = interface "refr_color", 
                "weight"               = interface "transparency",
		"use_directional_weight" off,
                "on" on
            },
            {
                "shader" "diffuse",      # Diffuse
                "bump"                 = interface "overall_bump",
                "weight_tint"          = interface "diffuse", 
                "weight"               = interface "diffuse_weight",
		"use_directional_weight" off,
                "on" on
            }
        ]
    )

    root = "mia_layers"
    
    apply material, texture, shadow, photon
    version 1
end declare

mia_material_emulatormia_material(_x) と同じパラメータを持ちますが、次の違いがあります。これらの違いのいくつかは、ユーザ インタフェースやシンプルなマッピング シェーダによって隠すことができます。

mia_material の以下のパラメータは存在しないか、異なっています。

cutout_opacity
mila_material の「可視性」の入力に直接入力する必要があります。
brdf_fresnel
mia_material のブール スイッチです。mila_layer では、"use_directional_weight" に方向に依存するウェイトを付けるかどうかをまず選択します。そのあとで、オンならば、方向に依存するウェイト モードを指定できます。現在のところ 2 つの値(0 = フレネル、1 = カスタム カーブ)から選択できます。方向に依存するウェイトを使用する際は、値は 1 が以前のパラメータの「オフ」に、0 が「オン」に対応します。mia_material で方向に依存しないウェイトを取得するには、これが常に方向に依存していたため、カスタム カーブの入力を調整する必要がありました。
refl_is_metal
存在しません。拡散カラーと同じ反射カラーを設定することで、同じエフェクトが実現します。
brdf_conserve_energy
存在しません。これらのシェーダでは常にエネルギーが節約されます。
refl_gloss
refr_gloss
これは、さまざまな範囲を取ります。既定では、mia_material のスペキュラ ハイライトに対してレイヤ化した粗さが光沢パラメータと同様で反対の動作をします。ただしカーブは、粗さの変化に対して視覚的にはさらに直線的な動作になるはずです。そのカーブの指数(現在の既定値は 3)を変更できるオプションがもう 1 つあります。それを使って、粗さをマテリアルのぼかしに対応させる方法を調節することもできます。詳細は、mila_glossy_reflection を参照してください。
overall_bump
standard_bump
no_diffuse_bump
bump_mode
単一のバンプ入力である overall_bump に置き換えられました。これらのスイッチのさまざまな変数(個別の拡散バンプ入力など)をサポートするために、このフェノメナのさまざまな変数が簡単に作成できます。
multiple_outputs
レイヤ シェーダでは常に自動的にオンになります。
refl_interpolate
refl_hl_only
refl_interpolate
intr_*
fg_quality*
no_visible_area_hl
do_refractive_caustics
skip_inside_refl
backface_cull
hl_vs_refl_balance
additional_color
mode
lights
これらはすべて、このフェノメナまたはレイヤ化シェーダによってサポートされていない機能を参照します。

イメージの例

カー ペイントをエミュレートする

カー ペイント シェーダのエミュレーションは実際はもっと困難です。これはカー ペイント シェーダが、古くて、物理特性の再現性が非常に低いためです。このエミュレーションは視覚的に正確なものではありません。むしろよりリアルな外観になり、物理的に正確なものになります。古いカー ペイント フェノメナには、次の問題があります。

これは、「実用性の高い」カー ペイント パラメータを複製し、物理的により正確な新しいフェノメナを作成する場合に、大きな意味を持ちます。これによって、古いシェーダの機能の一部は維持されますが、よりリアルになります。ここでは、このようなフェノメナに対する 1 つの試みを紹介します。他のバージョンが存在している可能性もあります。

declare phenomenon
    color "mila_layer_car_paint" 
    (
        color   "base_color"             default 0.8 0.1 0,
        color   "edge_color"             default 0 0 0,
        scalar  "edge_color_bias"        default 1.0,
        color   "lit_color"              default 0.6 0 0.2,
        scalar  "diffuse_weight"         default 1.0,

        color   "flake_color"            default 1 1 1,
        scalar  "flake_weight"           default 1.0,

        scalar  "flake_density"          default  0.8,
        scalar  "flake_strength"         default  0.8,
        scalar  "flake_scale"            default 0.1,
        integer "flake_type"             default  0,
        integer "flake_cell_style"       default 0,
        scalar  "flake_cell_size"        default  0.3,
        
        # New - more physical - parameters
        scalar  "flake_roughness"        default 0.4,

        scalar  "glossy_paint_weight"    default 0.1,
        scalar  "glossy_paint_roughness" default 0.6,
        
        color   "clearcoat_1_color"      default 1 1 1,
        scalar  "clearcoat_1_weight"     default 1.0,
        scalar  "clearcoat_1_roughness"  default 0.0,
        
        color   "clearcoat_2_color"      default 1 1 1,
        scalar  "clearcoat_2_weight"     default 0.0,
        scalar  "clearcoat_2_roughness"  default 0.4,
        
        scalar  "clearcoat_ior"          default 1.8,
        
        scalar  "quality"                default 1.0,
        scalar  "max_distance"           default 0.0,

        # Dirt
        color   "dirt_color"             default .3 .3 .3,
        scalar  "dirt_weight"            default 0.0,

        scalar  "irradiance_weight"      default 1.0,
    )

    shader "flakes"  "mila_bump_flakes" (
        "weight"    = interface "flake_weight",
        "scale"    = interface "flake_scale",
        "perturbation" = interface "flake_strength",
        "density"  = interface "flake_density",
        "type"    = interface "flake_type",
        "circle_size"  = interface "flake_cell_size",
        "cell_style" = interface "flake_cell_style",

    )
    
    shader "dirt" "mila_diffuse_reflection" (
        "tint"  = interface "dirt_color",
        "indirect" = interface "irradiance_weight"
    )

    shader "clearcoat_2" "mila_glossy_reflection" (
        "roughness" = interface "clearcoat_2_roughness",
        "quality"   = interface "quality"
    )

    shader "clearcoat_1" "mila_glossy_reflection" (
        "roughness" = interface "clearcoat_1_roughness",
        "quality"   = interface "quality"
    )

    shader "flakes_gloss"  "mila_glossy_reflection" (
        "tint"      = interface "flake_color",
        "roughness" = interface "flake_roughness",
        "quality"   = interface "quality"
    )

    shader "glossy_paint" "mila_glossy_reflection" (
        "roughness"      = interface "glossy_paint_roughness",
        "quality"        = interface "quality"
    )
    
    shader "edge_diffuse" "mila_diffuse_reflection" (
        "tint"   = interface "edge_color",
        "indirect"  = interface "irradiance_weight"
    )

    shader "main_diffuse" "mila_diffuse_reflection" (
        "tint"   = interface "base_color",
        "indirect"  = interface "irradiance_weight"
    )

    shader "mia_layers" "mila_layer" (
        "layers" [
            {
                "shader"               "dirt",
                "weight"               = interface "dirt_weight",
                "weight_tint"          1 1 1,
                "on" on
            },
            {
                "shader"               "clearcoat_1",
                "weight"               = interface "clearcoat_1_weight",
                "weight_tint"          = interface "clearcoat_1_color",
		"use_directional_weight" on,
                "directional_weight_mode" 0,
                "ior"                  = interface "clearcoat_ior",
                "on" on
            },
            {
                "shader"               "clearcoat_2",
                "weight"               = interface "clearcoat_2_weight",
                "weight_tint"          = interface "clearcoat_2_color",
		"use_directional_weight" on,
                "directional_weight_mode" 0,
                "ior"                  = interface "clearcoat_ior",
                "on" on
            },
            {
                "shader"               "flakes_gloss",
                "weight"               = "flakes.visibility",
                "weight_tint"          1 1 1,
                "bump"                 = "flakes.normal",
                "on" on
            },
            {
                "shader"               "glossy_paint",
                "weight"               = interface "glossy_paint_weight",
                "weight_tint"          = interface "lit_color",
                "on" on
            },
            {
                "shader"               "edge_diffuse",
                "weight"               = interface "diffuse_weight",
                "weight_tint"          1 1 1,
                "use_directional_weight" on,
                "directional_weight_mode" 1,
                "normal_reflectivity"  0.0,
                "grazing_reflectivity" 1.0,
                "exponent"  = interface "edge_color_bias",
                "on" on
            },
            {
                "shader"               "main_diffuse",
                "weight_tint"          1 1 1,
                "weight"               = interface "diffuse_weight",
                "on" on
            }
        ]
    )

    root = "mia_layers"
    
    apply material, texture, shadow, photon
    version 2
end declare

このフェノメナは、次の 7 つのレイヤ(上から下)で作成されています。

以下はシェーダのパラメータです。

base_color
edge_color
edge_color_bias
diffuse_weight
元のカー ペイント フェノメナでは、すべて同様に動作します。
lit_color
動作は少し異なっていますが、元の名前が維持されています。古いシェーダでは特殊な色付きハイライトとしてフェイクされたもので、実際には、新しい色付き光沢反射レイヤの色です。
flake_color
flake_weight
flake_density
flake_strength
flake_scale
すべて、本質的に元のカー ペイント フェノメナと同じように動作します(カー ペイント ライブラリのドキュメントを参照してください)。
flake_roughness
薄片の粗さで、範囲は 0 ~ 1 です。
glossy_paint_weight
glossy_paint_roughness
新しい「色付き光沢ペイント」レイヤのウェイトと粗さです。lit_color をその反射カラーとして使用します。
clearcoat_X_color
clearcoat_X_weight
clearcoat_X_roughness
clearcoat_ior
クリアコート用に、本当に光沢がある 2 つのレイヤを作成します。これらは自動的に適切な反射を行い、フレネル エフェクトが常に適用されます (clearcoat_ior の IOR を使用)。ハイライトと反射を個別にコントロールしていた、古くて複雑なパラメータのほとんどがなくなり、ハイライトと反射の「エッジ」と「ベース」のウェイトに対する不自然な設定もすべてなくなりました。これらはすべて、フレネル エフェクトをとりあえずシミュレートするためだけに残されていました。
max_distance
dirt_color
dirt_weight
irradiance_weight
すべて前と同じ動作をします。

古いフェノメナから除去された廃止パラメータ:

lit_color_bias
ほぼ glossy_paint_roughness に置き換えられました。
flake_reflect
flake_exp
薄片は現在、常に物理的な反射を行います。flake_roughness に置き換えられました。
flake_decay
global_weight
このフェノメナではサポートされていません。
ambient
diffuse_bias
reflection_color
edge_factor
reflection_edge_weight
reflection_base_weight
glossy_spread
spec_*
これらはすべて、非物理的であるか、不自然な範囲にあるかのいずれかです。これらは粗さパラメータを持つ光沢レイヤに置き換えられるため、本質的には常に何かを反射し(つまり、反射の個別設定はすべて除去され)、フレネル反射カーブに追従します。
モード
ライト
レイヤ シェーダには適用されません。

イメージの例