mental ray ペイント シェーダ

バージョン 3.7.1.23
2008 年 6 月 26 日

目次

はじめに

自動車の塗装関連のシェーダは、ペイント ライブラリに含まれています。シェーダとフェノメナの宣言は、ファイル paint.mi で提供されます。シェーダを使用するには、宣言ファイルをインクルードし、ライブラリをリンクする必要があります。

    link "paint.so"
    $include "paint.mi"

mental ray のカー ペイント シェーダを使用したレンダリング イメージの例

自動車の塗装には固有の特性がいくつかあります。自動車のボディの上には、薄い顔料の層があります。この層は、見る角度や入射光の入射角に応じて、色が変化して見えるという特性があります。

この層には非常に小さな金属片(フレーク)が浮いています。金属片は光を反射し、晴れた日にはキラキラ輝いて見えます。これは、個々の金属片が太陽光を直接反射するためです。

この層の上にはクリア コート層があります。この層の反射と光沢は、クリア コート層の性質や、ワックス コーティングが施されているかどうかに応じて異なります。この層は特にフレネル効果が顕著に現れ、浅い視射角から見たときほど反射が強くなります。


カー ペイントの構造

カー ペイント フェノメナ

mi_car_paint_phen または mi_car_paint_phen_x は、マテリアルのサーフェス シェーダとして適用する必要があります。mi_car_paint_phen_x 変数は、mi_car_paint_phen 変数と同じ計算を実行しますが、最終的なカラーに合成する前に個別のチャンネルとして個々のコンポーネントを返します。このフェノメナは以下をサポートします。

フェノメナの宣言は以下のとおりです。

mi_car_paint_phen
    declare phenomenon "mi_car_paint_phen" (
        color       "ambient",
        color       "base_color",
        color       "edge_color",
        scalar      "edge_color_bias",
        color       "lit_color",
        scalar      "lit_color_bias",
        scalar      "diffuse_weight",
        scalar      "diffuse_bias",
	color       "flake_color",
        scalar      "flake_weight",
        scalar      "flake_reflect",
        scalar      "flake_exp",
        scalar      "flake_density",
        scalar      "flake_decay",
        scalar      "flake_strength",
        scalar      "flake_scale",
        color       "spec",         
        scalar      "spec_weight",      
        scalar      "spec_exp",         
        color       "spec_sec",
        scalar      "spec_sec_weight",  
        scalar      "spec_sec_exp",     
        boolean     "spec_glazing",
        color       "reflection_color",
        scalar      "edge_factor",    
        scalar      "reflection_edge_weight",
        scalar      "reflection_base_weight",
        integer     "samples",
        scalar      "glossy_spread",
        scalar      "max_distance",
        boolean     "single_env_sample",
        color       "dirt_color",
        scalar      "dirt_weight",
        scalar      "irradiance_weight",
        scalar      "global_weight",
        integer     "mode",
        array light "lights"
    )
  
mi_car_paint_phen_x
    declare phenomenon
    struct {
        color   "result",         # main output

        color   "ambient_result",
        color   "ambient_raw",
        color   "ambient_level",

        color   "diffuse_result",
        color   "diffuse_raw",
        color   "diffuse_level",

        color   "indirect_result",
        color   "indirect_raw",
        color   "indirect_level",

        color   "spec1_result",
        color   "spec1_raw",
        color   "spec1_level",

        color   "spec2_result",
        color   "spec2_raw",
        color   "spec2_level",

        color   "flake_result",
        color   "flake_raw",
        color   "flake_level",

        color   "flake_refl_result",
        color   "flake_refl_raw",
        color   "flake_refl_level",

        vector  "flake_normal",

        color   "dirt_result",
        color   "dirt_raw",
        color   "dirt_level",

        color   "reflection_result",
        color   "reflection_raw",
        color   "reflection_level"
    } "mi_car_paint_phen_x" (
        color       "ambient",
        color       "base_color",
        color       "edge_color",
        scalar      "edge_color_bias",
        color       "lit_color",
        scalar      "lit_color_bias",
        scalar      "diffuse_weight",
        scalar      "diffuse_bias",
	color       "flake_color",
        scalar      "flake_weight",
        scalar      "flake_reflect",
        scalar      "flake_exp",
        scalar      "flake_density",
        scalar      "flake_decay",
        scalar      "flake_strength",
        scalar      "flake_scale",
        color       "spec",         
        scalar      "spec_weight",      
        scalar      "spec_exp",         
        color       "spec_sec",
        scalar      "spec_sec_weight",  
        scalar      "spec_sec_exp",     
        boolean     "spec_glazing",
        color       "reflection_color",
        scalar      "edge_factor",    
        scalar      "reflection_edge_weight",
        scalar      "reflection_base_weight",
        integer     "samples",
        scalar      "glossy_spread",
        scalar      "max_distance",
        boolean     "single_env_sample",
        color       "dirt_color",
        scalar      "dirt_weight",
        scalar      "irradiance_weight",
        scalar      "global_weight",
        integer     "mode",
        array light "lights"
    )

拡散パラメータ

ambient
アンビエント ライト コンポーネント。このパラメータの扱いは、他の基本的な各種シェーダのアンビエント/アンビエンス パラメータの組み合わせとは異なります(基本的なシェーダのパラメータは以下のような他の拡散カラーのパラメータの影響を受けるため、オブジェクトの "アンビエント カラー" ではなく入射光を表します)。
base_color
マテリアルの拡散の基本カラー。
edge_color
浅い視射角で(つまり、エッジ方向)を見たときのカラー。通常は、ずっと暗く見える傾向があります。スポーツ カーのような濃いメタリック ペイントでは、ほぼ黒に見えます。
edge_color_bias
エッジ方向に向けたカラーの減衰率を定義します。有効範囲は 0.0 ~ およそ 10.0 で、値 0.0 で効果は無効になります。値が低いほどエッジの領域が狭くなり、値が高いほどエッジの領域が広くなります。

見る角度による色の変化: base_color の赤から edge_color の青
(分かりやすいように、非現実的なカラーを使っています)への変化を、さまざまな edge_bias 値を使用して示した例
lit_color
光源に面する領域のカラー。
lit_color_bias
カラーのライト方向の減衰率を定義します。有効範囲は 0.0 ~ およそ 10.0 で、値 0.0 で効果は無効になります。値が高いほどライトに面する色付きの領域が小さく/狭くなり、値が低いほどライトに面する色付きの領域が大きく/広くなります。

見る角度による色の変化: base_color の赤から lit_color の緑
(分かりやすいように、非現実的なカラーを使っています)への変化を、さまざまな lit_bias 値を使用して示した例
拡散パラメータの全体的なレベルは、diffuse_weight パラメータを使用して調整できます。
diffuse_bias
拡散シェーディングの減衰を変更します。有効範囲はおよそ 0.5 ~ 2.0 で、値 1.0 が標準的な均等拡散シェーディングに相当します。値が高いほど拡散のピークが光源に近づき、値が低いほど拡散のピークが均等化されます。
irradiance_weight
サーフェスに対する間接光(フォトンおよびファイナル ギャザリング)の影響を設定します。自動的に PI(円周率)で除算されるため、たとえば値を 1.0 にするとウェイトは 1.0/PI(標準)になります。

スペキュラ パラメータ

spec
spec_weight
spec_exp
一次スペキュラ ハイライト カラー、効果の度合いを指定するためのスカラー乗数、ハイライトの Phong 指数。
spec_sec
spec_sec_weight
spec_sec_exp
二次スペキュラ ハイライト カラー、スカラー乗数、Phong 指数。
spec_glazing
一次スペキュラ ハイライトで特別なモード(グレージング)を有効にします。スペキュラ ハイライトにしきい値を適用することで、より磨かれた光沢のあるサーフェスを作成します。ワックスで磨かれたピカピカのスポーツ カーの場合は、グレージングをオンにします。逆にボロボロの廃車の場合はオフにします。

左から右の順: フレーク(金属片)のスペキュラのみ、標準的なスペキュラ、"グレージング" モードを有効、"グレージング" モードとフレークのスペキュラを併用

フレーク パラメータ

flake_color
フレーク(金属片)のカラー(反射)。通常は白です。
flake_weight
フレークのカラーのスカラー乗数。
flake_reflect
フレークのレイトレース対象の反射の量を定義します。たとえば、HDRI 環境のキラキラ輝く反射を表現できます。値 0.0 で効果は無効になります。通常、この効果は非常に微妙なものであるため、たいていの場合は値 0.1 で十分です。反射の最終的な強さには、flake_colorflake_weight の値も影響します。
flake_exp
フレークの Phong スペキュラ指数。
flake_density
フレークの密度を設定します。有効範囲は 0.1 ~ およそ 10.0 です。値が低いほどフレークの密度が薄くなり、値が高いほど濃くなります。
フレークは極めて小さいため、見た目の密度がピクセルより大幅に小さくなると、レンダリング結果にアーティファクトが見られるようになります。また、レンダリングのオーバーサンプリングを高く設定している場合は、小さなフレークによって大量のオーバーサンプリングが発生する可能性があり、レンダリングにも必要以上に時間がかかる場合があります。これは、オーバーサンプリングによる平均化処理によって、実質上、フレークの効果が無効になるためです。これを防ぐには、flake_decay パラメータを使用します。このパラメータは、フレークの影響を減衰させる距離を設定します。値 0.0 で減衰は無効になります。正の値を指定すると、flake_weight の値が徐々に変化して、この距離でゼロになります。

異なる距離に位置する、減衰が設定されていないフレーク。最も離れた位置にあるフレークでは、アニメーションにフリッカーが発生したり、無用なオーバーサンプリングが発生してレンダリング時間が長くなります(この例では、分かりやすいように、オーバーサンプリングを低く設定しています)。

フレークの減衰を使用した例。フレークの強さが距離に伴って減衰します。この例でも、前の例と同様に、オーバーサンプリングを意図的に低く設定しています)。
flake_strength
フレークの方向の差異を設定します。有効範囲は 0.0 ~ 1.0 です。値 0.0 ですべてのフレークがサーフェスに対して平行になります。値が高いほどフレークの方向の差異が大きくなります。
flake_scale
フレークのサイズ。手続き型テクスチャはオブジェクト スペースで計算されるため、オブジェクトによって制御されます。したがって、フレークのスケールは、オブジェクトのインスタンスにおけるスケール変換の影響を受けます。

反射パラメータ

クリア コートは一般的に、浅い角度から見たとき(エッジ)ほど反射が強くなります。オプションで、クリア コート層に光沢を与えることができます。

reflection_color
クリア コート層の反射のカラーを設定します。通常は白です。
edge_factor
エッジの "幅" を定義します。
reflection_edge_weight
エッジでの反射の強さ(通常は 1.0 に設定します)。
reflection_base_weight
正面から見たときの反射の強さ(通常は 0.1 ~ 0.3 のような低い値に設定します)。
samples
レイトレース光沢反射の数を設定します。値 0 で光沢は無効になります。
glossy_spread
光沢の量を設定します。自動車は一般的にほぼ鏡状であるため、この値は小さく設定します。

光沢反射は、基本シェーダ mib_glossy_reflections を使用して作成されるため、パラメータ max_distance(反射レイの到達範囲を制限します)と single_env_sample(環境マップのルックアップを最適化します)はシェーダ mib_glossy_reflection のエクスポーズされたパラメータです。パラメータのサブセットのみがエクスポーズされ、さらに必要な場合は、カスタム シェーディング グラフを作成するか、mi_car_paint_phen フェノメナの独自のバリエーションを作成します。

ダーティ パラメータ

シンプルな汚れの均等拡散層で、その下にある顔料層とクリア コート層を覆います。


現実世界の自動車には、たいてい汚れが付着しています。この汚れの層は、汚れた部分にバンプ マップを適用するなど、汚れを付けるためのマップを手描きでペイントして再現します。
dirt_color
汚れのカラー。
dirt_weight
この層の汚れの量。通常は、テクスチャ シェーダに接続して、サーフェス上の汚れにバリエーションを付けます。dirt_weight が 0.0 の場合、汚れは付着しません。

高度なパラメータ

irradiance_weight
サーフェスに対する間接光(フォトンおよびファイナル ギャザリング)の影響を設定します。自動的に PI(円周率)で除算されるため、たとえば値を 1.0 にするとウェイトは 1.0/PI(標準)になります。
global_weight
グローバルな調整を行うパラメータで、拡散、フレーク、およびスペキュラ サブシステム全体に作用します。ただし、反射と汚れには影響しません。
mode
ライトのモードです。
lights
このシェーダ用のオプションの直接光。

メタリック ペイント

このシェーダは、メタリック ペイントを表現するために使用します。ただし、顔料とフレーク(金属片)には対応しますが、非常に重要なクリア コートの反射には対応していません。完全な効果を得るには、反射シェーダと組み合わせて使用する必要があります(たとえば、mib_glossy_reflectionbase_material パラメータに接続します)。また、フレークを再現するには、mi_bump_flakes のようなバンプ シェーダも必要です。

また、汚れの層をサポートする mi_car_paint_phen などのフェノメナも使用できるので便利です。フェノメナのドキュメントには、パラメータに関するもう少し詳しい説明がサンプル イメージと共に記載されています。

このシェーダは以下をサポートします。

このシェーダには次の 2 つのバリエーションがあります。mi_metallic_paint は単一の最終的な合成カラーを返し、mi_metallic_paint_x は合成前の個別のコンポーネントの個別のチャンネルを返します。

mi_metallic_paint
  declare shader
      color "mi_metallic_paint" (
          color       "ambient"           default 0 0 0 1,
          color       "base_color"        default 0.8 0.1 0.0 1,
          color       "edge_color"        default 0.0 0.0 0.0,
          scalar      "edge_color_bias"   default 1.0,
          color       "lit_color"         default 0.6 0.0 0.2,
          scalar      "lit_color_bias"    default 8.0,
          scalar      "diffuse_weight"    default 1.0,
          scalar      "diffuse_bias"      default 1.5,
          scalar      "irradiance_weight" default 1.0,
          color       "spec"              default 1 1 1 1,
          scalar      "spec_weight"       default 0.2,
          scalar      "spec_exp"          default 60.0,
          color       "spec_sec"          default 1 1 1 1,
          scalar      "spec_sec_weight"   default 0.3,
          scalar      "spec_sec_exp"      default 25.0,
          boolean     "spec_glazing"      default on,
          color       "flake_color"       default 1.0 1.0 1.0 1,
          scalar      "flake_weight"      default 1.0,
          scalar      "flake_reflect"     default 0.0,
          scalar      "flake_exp"         default 45.0,
          scalar      "flake_decay"       default 0.0,
          shader      "flake_bump",
          scalar      "global_weight"     default 1.0,
          integer     "mode"              default 3,
          array light "lights"        
      )
      version 2
      apply material
  end declare 
mi_metallic_paint_x
  declare shader
      struct {
          color   "result",

          color   "ambient_result",
          color   "ambient_raw",
          color   "ambient_level",
 
          color   "diffuse_result",
          color   "diffuse_raw",
          color   "diffuse_level",
 
          color   "indirect_result",
          color   "indirect_raw",
          color   "indirect_level",
 
          color   "spec1_result",
          color   "spec1_raw",
          color   "spec1_level",
 
          color   "spec2_result",
          color   "spec2_raw",
          color   "spec2_level",
 
          color   "flake_result",
          color   "flake_raw",
          color   "flake_level",
 
          color   "flake_refl_result",
          color   "flake_refl_raw",
          color   "flake_refl_level",
 
          vector  "flake_normal"
      } "mi_metallic_paint_x" (
          color       "ambient"           default 0 0 0 1,
          color       "base_color"        default 0.8 0.1 0.0 1,
          color       "edge_color"        default 0.0 0.0 0.0,
          scalar      "edge_color_bias"   default 1.0,
          color       "lit_color"         default 0.6 0.0 0.2,
          scalar      "lit_color_bias"    default 8.0,
          scalar      "diffuse_weight"    default 1.0,
          scalar      "diffuse_bias"      default 1.5,
          scalar      "irradiance_weight" default 1.0,
          color       "spec"              default 1 1 1 1,
          scalar      "spec_weight"       default 0.2,
          scalar      "spec_exp"          default 60.0,
          color       "spec_sec"          default 1 1 1 1,
          scalar      "spec_sec_weight"   default 0.3,
          scalar      "spec_sec_exp"      default 25.0,
          boolean     "spec_glazing"      default on,
          color       "flake_color"       default 1.0 1.0 1.0 1,
          scalar      "flake_weight"      default 1.0,
          scalar      "flake_reflect"     default 0.0,
          scalar      "flake_exp"         default 45.0,
          scalar      "flake_decay"       default 0.0,
          shader      "flake_bump",
          scalar      "global_weight"     default 1.0,
          integer     "mode"              default 3,
          array light "lights"        
      )
      version 2
      apply material
  end declare 

拡散パラメータ

ambient
アンビエント ライトのコンポーネント。このパラメータの扱いは、他の基本的な各種シェーダのアンビエント/アンビエンス パラメータの組み合わせとは異なります(基本的なシェーダのパラメータは以下のような他の拡散カラーのパラメータの影響を受けるため、オブジェクトの "アンビエント カラー" ではなく入射光を表します)。
base_color
マテリアルの拡散の基本カラー。
edge_color
浅い視射角で(つまり、エッジ方向)を見たときのカラー。通常は、ずっと暗く見える傾向があります。スポーツ カーのような濃いメタリック ペイントでは、ほぼ黒に見えます。
edge_color_bias
エッジ方向に向けたカラーの減衰率を定義します。有効範囲は 0.0 ~ およそ 10.0 で、値 0.0 で効果は無効になります。値が低いほどエッジの領域が狭くなり、値が高いほどエッジの領域が広くなります。
lit_color
光源に面する領域のカラー。
lit_color_bias
カラーのライト方向の減衰率を定義します。有効範囲は 0.0 ~ およそ 10.0 で、値 0.0 で効果は無効になります。値が高いほどライトに面する色付きの領域が小さく/狭くなり、値が低いほどライトに面する色付きの領域が大きく/広くなります。
diffuse_weight
全体的な拡散シェーディングを制御します。
diffuse_bias
拡散シェーディングの減衰を変更します。有効範囲はおよそ 0.5 ~ 2.0 で、値 1.0 が標準的な均等拡散シェーディングに相当します。値が高いほど拡散のピークが光源に近づき、値が低いほど拡散のピークが均等化されます。
irradiance_weight
サーフェスに対する間接光(フォトンおよびファイナル ギャザリング)の影響を設定します。自動的に PI(円周率)で除算されるため、たとえば値を 1.0 にするとウェイトは 1.0/PI(標準)になります。

スペキュラ パラメータ

spec
一次スペキュラ ハイライトのカラー。
spec_weight
スカラー乗数。
spec_exp
Phong 指数。
spec_sec
二次スペキュラ ハイライトのカラー。
spec_sec_weight
スカラー乗数。
spec_sec_exp
Phong 指数。
spec_glazing
一次スペキュラ ハイライトで特別なモード(グレージング)を有効にします。スペキュラ ハイライトにしきい値を適用することで、より磨かれた光沢のあるサーフェスを作成します。ワックスで磨かれたピカピカのスポーツ カーの場合は、グレージングをオンにします。逆にボロボロの廃車の場合はオフにします。

フレーク パラメータ

flake_color
フレーク(金属片)のカラー(反射)。通常は白です。
flake_weight
フレークのカラーのスカラー乗数。
flake_reflect
フレークのレイトレース対象の反射の量を定義します。たとえば、HDRI 環境のキラキラ輝く反射を表現できます。値 0.0 で効果は無効になります。通常、この効果は非常に微妙なものであるため、たいていの場合は値 0.1 で十分です。反射の最終的な強さには、flake_colorflake_weight の値も影響します。
flake_exp
フレークの Phong スペキュラ指数。
フレークは極めて小さいため、見た目の密度がピクセルより大幅に小さくなると、レンダリング結果にアーティファクトが見られるようになります。これを防ぐには、flake_decay パラメータを使用します。このパラメータは、フレークの影響を減衰させる距離を設定します。値 0.0 で減衰は無効になります。正の値を指定すると、flake_weight の値が徐々に変化して、この距離でゼロになります。
flake_bump
実際に使用するフレーク バンプ シェーダ。シェーダ mi_bump_flakes をこの目的のために使用できますが、法線ベクトルを変更する他のシェーダ(たとえば、mib_passthrough_bump_map)を使用することもできます。
flake_bump に指定したシェーダは、カラーを返すか(このカラーはフレークのカラー(強度)になります)、カラーを変更しないままにします。

その他のパラメータ

global_weight
グローバルな調整を行うパラメータで、シェーダの出力に対するグローバルの乗数です。
mode
ライトのモードです。
lights
このシェーダ用のオプションの直接光。

フレーク バンプ シェーダ

このシェーダは、わずかに異なる方向を向いた個々の小さなフレークの外観を表すバンプ マップを作成するために設計されています。このシェーダは、手続き的に生成されたフレーク テクスチャに基づいて現在の法線ベクトルを少し変更します。また、そのフレークの "強度" を示すカラーも返します。

mi_bump_flakes
    declare shader "mi_bump_flakes" (
        scalar      "flake_density"     default 0.5,
        scalar      "flake_strength"    default 0.8,
        scalar      "flake_scale"       default 0.2,
        )
        version 1
        apply texture
    end declare
flake_density
返されたカラーにのみ影響し、法線ベクトルに対する変更量には影響しません。有効範囲は 0.1 ~ およそ 10.0 です。値が低いほどフレークの密度が薄くなり(より多くのフレークに黒に近い低いカラー値が与えられます)、値が高いほど濃くなります。
flake_strength
法線ベクトルの摂動量を示します。値の有効範囲は 0.0(効果は無効です)~ 1.0 です。値が低いほどフレークはサーフェスに平行になり、値が高いほど各フレークの方向の差異が大きくなります。
flake_scale
フレークのサイズ。手続き型テクスチャはオブジェクト スペースで計算されるため、オブジェクトによって制御されます。したがって、フレークのスケールは、オブジェクトのインスタンスにおけるスケール変換の影響を受けます。

Copyright (©) 1986-2008 by mental images GmbH