一般的なユーティリティ シェーダ

丸角

CG のイメージは "不自然" に見えがちです。これは、現実世界ではすべてのエッジはわずかに丸みを帯びていたり、面取りされていたり、擦り減っていたり、またはある程度フィレットされているのに対し、CG のオブジェクトのエッジは幾何学的にシャープであるためです。現実世界の丸みを帯びたエッジは、"光を捉え"、ハイライトを作り出すため、より魅力的に見えます。

mia_roundcorners シェーダを使用すると、レンダリング時に "丸みを帯びたエッジ" を疑似的に作成できます。このシェーダの主な目的は、モデリングを高速化することです。このシェーダを使用すれば、テーブルの天板などのオブジェクトを作成する場合に、エッジをわざわざフィレットしたり、面取りしたりする必要はありません。

丸角を使用していない例

丸角を使用していない例

丸角を使用した例

丸角を使用した例

このシェーダは、法線ベクトルを摂動させるため、通常バンプ マップが使用される箇所に適用する必要があります(たとえば、mia_material の場合は bump パラメータ)。

この関数はディスプレイスメントではなく、バンプ マッピングと同様に単なるシェーディング効果にすぎません。直線的なエッジやシンプルなジオメトリには最適ですが、大きくカーブしたジオメトリには適していません。


declare shader vector "mia_roundcorners" (
        scalar "radius",
        boolean "allow_different_materials",
        shader  "bump",
        integer "bump_mode",
        vector  "bump_vector",
    )
    version 3
    apply texture
end declare	

radius パラメータは、丸め効果の半径をワールド空間の単位で定義します。

allow_different_materialsoff の場合、丸め効果は同じマテリアルの面に対してのみ適用されます。on の場合、丸め効果はすべてのマテリアルの面に対して適用されます。

bump パラメータは、サーフェスの追加のバンプを処理する他のバンプ シェーダ(たとえば、mib_bump_map2 など)に渡されます。このパラメータは、bump_mode が 0 の場合にのみ使用されます。

OEM 統合をよりよくサポートするために、新しいパラメータ bump_modebump_vector が導入されました。

bump_mode は、bump_vector の座標空間とシェーダ自体の戻り値の座標空間(ベクトルでもある)を定義し、それを "法線ベクトルの摂動" として解釈するか、または完全に新しい"法線ベクトル" として解釈するかどうかを定義します。

有効な値は以下のとおりです。

"追加" モードとは、ベクトルに法線の摂動を含めることを意味します。すなわち、現在の法線に"追加"される変更です。"設定"モードでは、実際の法線が新しいベクトルによって置き換えられ、上記の座標空間で解釈されます。出力も同様に、"追加" モードでは、シェーダが現在の法線に追加されるベクトルの摂動を返し、"設定" モードでは、法線ベクトル全体を返します。いずれの場合も、シェーダ自体が実際に現在の法線を変更することはありません。

環境ブラー

シェーダの機能とパラメータ

mia_envblur シェーダは、他の環境シェーダ(通常、HDRI 環境マップで環境参照を実行するシェーダ)を入力として受け取ることによって機能します。レンダリングの開始時に、1 回限りの設定を行い、特殊な形式のこの環境シェーダの結果を内部のピラミッド型のフィルタ構造にラスタライズします。

次に、レンダリング処理が進むと、このシェーダは、非常に大量の光沢反射光線を環境に照射する方法に非常に類似した方法で、この環境マップで非常に効果的なブラー処理を実行し、完全に滑らかな結果を迅速に作成します。


declare shader "mia_envblur" (
        shader  "environment",
        scalar  "blur"               default 0.0,
        boolean "mia_material_blur"  default on,
        integer "resolution"         default 200
    )
    version 1
    apply environment, texture
end declare

environment は、このシェーダによって参照される実際の環境シェーダです。これが指定されていない場合、グローバル カメラ環境が使用されます。

blur は、イメージに適用されるブラーの量(0.0 ~ 1.0 の範囲)です。0.0 の場合、内部のビットマップはバイパスされ、環境シェーダは、mia_envblur が存在しないかのように直接参照されます。

mia_material_bluron に設定すると、ブラーの量は自動的に計算されます。mia_material によって実行される反射環境参照によって、mia_envblur で適切なブラーが生成されます。この場合、blur を 0.0 のままにします。この機能の詳細については、こちらを参照してください。

resolution は、フィルタリングに使用される内部のピラミッド型のデータ構造の解像度です。デフォルト値の 200 を設定すると、後続のフィルタリング用に 200 x 200 サンプルのマップが取得され、保存されます。これは、環境マップの最小機能を解決するのに十分高い値に設定する必要があります。一般に 200 は静止イメージには十分な値ですが、アニメーションにはより高い解像度(1000)が必要です。

mia_envblur は開始時に environment シェーダの 1 回限りのラスタライゼーションを実行する点に注意してください。つまり、このシェーダはシーン全体に対して一定でなくてはならず、環境シェーダの位置に依存する複雑なブレンドは実行できません。ラスタライゼーションはフレームごとに新たに実行されるため、環境は経時的に変化します。

使用例

環境ブラー シェーダ mia_envblur は、mental ray の環境を主に反射する(他のオブジェクトを主には反射しない)レンダリングの精度と性能を向上させるために使用します。

このシェーダは主に、HDRI 環境マップによる反射を利用したプロダクトのビジュアライゼーション レンダリングや、HDRI の反射を使用して CG オブジェクトを実写のシーンに統合して滑らかかつ迅速に参照を行えるビジュアル エフェクトを作成したいような場合に役立ちます。

このシェーダは、通常の屋内の建築レンダリング用ではありません。そのような(閉鎖された)シーンでは、ほとんどの反射光線はバウンドして他のオブジェクトに当たるためです。このシェーダの目的は、他のオブジェクトに当たらない反射光線をサポートすることです。つまり、"屋外" のシーンで最も役に立ちます1

環境マップを反射するオブジェクト

環境マップを反射するオブジェクト

これは、環境マップ2を反射している、光沢(完璧なミラー反射)のないオブジェクトの例です。擬似ランダム サンプリングが実行されていないため、問題は見られません。

しかし、ここで作成する必要があるのは光沢反射です。mia_material の光沢反射を単に使用すると、以下のような結果になります。

サンプル数 8 の光沢反射

サンプル数 8 の光沢反射

デフォルトのサンプル数 8 の光沢反射では、特に高コントラストの環境マップにはまるで不十分です。光沢サンプルを 100 に設定すると(パフォーマンス ヒットは大きくなります)、以下のような結果になります。

サンプル数 100 の光沢反射

サンプル数 100 の光沢反射

改善はされましたが、まだ "滑らかな" 光沢反射にはほど遠い状態です。サンプルを 100 に設定したことによって、レンダリング速度が極端に低下したにもかかわらず、まだ不十分な結果です。どうすればよいでしょうか。

ここでは、環境を何度も参照することが目的ではありません。参照する必要があるのは、8 回でも 100 回でもなく、1 回です。ただし、その参照には既に目的のブラーが含まれている必要があります。

これには、mia_materialsingle_env_sample(環境からの単一サンプル)パラメータを有効にし、mia_envblur を環境シェーダとして、"オリジナル" の環境マップを mia_envblurenvironment パラメータとして適用する必要があります。

光沢サンプル数をオリジナルの 8 に戻すと、以下のレンダリング結果が迅速に得られます。

mia_envblur を使用した光沢反射

mia_envblur を使用した光沢反射

レンダリング結果は大幅に改善され、レンダリング速度も大幅に高速になりましたが、ブラーの度合いが一定です。より高度な方法は、mia_material_blur を有効にして、mia_envblur が適用対象のブラーを取得できるようにすることです。

ここでは、以下のマップを mia_materialrefl_gloss パラメータに既に適用済みであると仮定します。

光沢マップ

光沢マップ

mia_envblur を使用した場合のレンダリング結果は以下のとおりです。

mia_material_blur を介してマッピングされた光沢

mia_material_blur を介してマッピングされた光沢

このような使用方法では、mia_envblur シェーダは等方性参照のみをサポートし、mia_material の異方性パラメータを無視する点に注意してください。

また、single_env_sample 機能を必ず使用してください。通常、環境マップにブラーを適用するだけでは不十分で、ノイズが発生します。

他のオブジェクト は複数のサンプルを使用して従来の方法で反射し、この機能は環境参照にのみ適用される点に注意してください。そのため、refl_falloff_dist(最大距離)を使用して "実際の" 反射を隣接するオブジェクトのみに限定し、環境が遠方のオブジェクトの役目を引き継ぐようにするのに便利です3

refl_falloff_dist(最大距離)を使用していない例

refl_falloff_dist(最大距離)を使用していない例

refl_falloff_dist(最大距離)を使用した例

refl_falloff_dist(最大距離)を使用した例

右のイメージでは、馬の脚の床に非常に近い部分のみが反射しています。逆を言えば、馬の脚には最も近い床の部分のみが反射しています。その他は環境反射です。このため、これらの反射を実際にトレースする場合に比べて迅速に結果が得られ、イメージのノイズも削減できます。

光源

シェーダの機能とパラメータ

mia_light_surface シェーダは、従来の CG の "ライト" を使用してシーンのイルミネーションを作成する一方で、蛍光灯の実際の管、電球の実際のバルブなど、光源の "可視" 部分の物理的に妥当なレンダリングを作成するために主に使用します(以下の使用例を参照)。

mia_light_surface の使用例

mia_light_surface の使用例

上のイメージでは、実際のイルミネーションは、細長い四角形のエリア ライトが光源で、スぺキュラ ハイライトが発生するようには設定されていません。蛍光灯の可視の "グロー" は、反射には現れるように設定されていますが(そのため、より正確な "ハイライト" になります)、FG レイに対しては不可視なので追加ライトとして間違って取り扱われることはありません。

mia_light_surface シェーダは、シェーダ自体がカラーを提供するか、シーン内の既存のライト(ライトのセット)からカラーを得ることができます。

シェーダ自体は、カラーを返すだけであり、他のシェーディングを行うことはありません。mia_materialadditional_color(追加のカラー)に接続して使用することをお勧めします。

mia_light_surface シェーダのパラメータは以下のとおりです。


declare shader "mia_light_surface" (
        color		"color"        default 1 1 1,
        scalar      "intensity"    default 1.0,
        scalar      "fg_contrib"   default 0.0,
        scalar      "refl_contrib" default 0.0,
        boolean     "use_lights",
        scalar      "lights_multiplier" default 1.0, 
        vector      "lights_eval_point" default 0.0 0.0 0.0,
        array light "lights"
    )

version 3 apply texture end declare

color(カラー)は、全体的なカラーで、組み込み型のライトまたは光源から得たライトの両方に適用されます。

intensity(強度)は、"組み込み" のライトの強度です。つまり、colorintensity を乗じた強度のサーフェスがカメラに映ります(use_lights がオフに設定されている場合。以下を参照)。

fg_contrib(ファイナル ギャザーへの寄与度)は、FG レイに対して可視のライトの割合で、refl_contrib(反射への寄与度)は反射光線に対して可視のライトの割合です。

use_lights(ライトの使用)がオンの場合、lights(ライト)配列にリストされたライトはポーリングされ、ライトの強度(lights_multiplier(ライト マルチプライヤ)を乗じた強度)は、intensity パラメータによって指定された出力に追加されます。L が lights リストのすべてのライトの出力の場合、シェーダの最終的な出力のカラーは次の計算式で求められます。

color * (L * lights_multiplier + intensity)

lights_eval_point(ライト評価ポイント)が 0,0,0 の場合、ライトの強度は、シェーディング対象の 3D 空間のポイントで評価されます(シャドウは無効)。IES プロファイルが設定されたライトの場合は、望ましい結果が得られない可能性があるため、ライトのカラーを評価する明示的なポイントを指定できます。この場合、ライトの座標空間内のポイントを指定します。

使用例

一般的なイルミネーション

現実の世界では、光を放出するすべてのオブジェクトは目に見えます。つまり、光を放出するオブジェクトには領域があり、その領域から光を放出します。FG を使用する場合、mental ray は、シーンに光エネルギーを追加するサーフェスをまるで光源のように扱います。しかし、可能な限り最高精度の結果を得るためには、FG を非常に高く設定する必要があります。ただし、レンダリング時間は長くなります。

コンピュータ グラフィックスの光源は、ポイント ライトまたはエリア ライトのいずれかです。エリアライト自体はレンダリングに表示される場合と表示されない場合があります。たいていは、単に実際の光源を使用する方がより効率的です。

FG を放出、FG を非放出、ポイント ライトを使用

FG を放出、FG を非放出、ポイント ライトを使用

上のイメージでは、チェック模様の床上に、mia_light_surface を使用している 3 つのパッチがあります。左のパッチは、fg_contrib が 1.0 に設定され(そのため、床を照らしています)、他の 2 つのパッチは、 0.0 に設定されています。ただし、右のパッチの背後にはポイント ライトが隠れています。

近距離では(または屋外の空全体のような非常に大きな光源がある場合)、FG はオブジェクトを非常に高精度で照らします。長距離では(または光源が小さい場合)、明示的な光源を使用した方がより効果的です。

mia_light_surface は、fg_contrib および refl_contrib パラメータを介してオブジェクトを反射光線または FG レイに対して "可視" に(およびその割合を)設定する必要がある場合に、個別のコントロールを提供します。下のイメージでは、わずかに反射するチェック模様の床を使用してこれを表しています。これらのパッチの背後では光源は使用されていません。

FG および反射に対する可視性

FG および反射に対する可視性

左のパッチは、FG(床を照らします)と反射(床に反射します)の両方に対して可視です。中央のパッチは床を照らさず(fg_contrib はゼロ)、右のパッチは床に反射しません(refl_contrib はゼロ)。

ハイライトと反射

現実の世界では、可視光を放出するオブジェクトは、シーンを撮影しているカメラに対して可視で、他のオブジェクトに反射(光沢)します。コンピュータ グラフィックスでは、光源はカメラには不可視で、反射はマテリアル シェーダによる "ハイライト" を使用して "擬似的に" 再現されます。

mia_material は、光源にハイライトを生成するかどうかを指示するプロトコルをサポートしています。このプロトコルは、ほとんどの OEM アプリケーションの光源によって実装されており、"Affect Specular" または "Emit Specular" などのフラグを検索します。

各種フラグが設定された、パッチの背後に隠れたライト

各種フラグが設定された、パッチの背後に隠れたライト

上のイメージの各パッチの背後にはライトが隠れています。左のパッチは、スペキュラ光と拡散反射光の両方を放出しています。中央のパッチは、スペキュラ光のみを放出し、右のパッチは拡散反射光のみを放出しています。さらに、右のパッチでは、fg_contrib がゼロに設定されています。

ご覧のとおり、左のパッチは過剰なイルミネーションを作成しています。これは、ライトとパッチの両方からイルミネーションを得ているためです。中央のパッチは、小さな "ハイライト"(光源は単なるポイント ライト)の奇妙な効果を反射の内側に作成しています。これは、"可視光" を擬似的に再現したものです。

ここではこの効果はイメージを損なうので、この効果は無効にします(右のパッチではライトを無効にしています)。この効果を無効にするには、サーフェスが反射を処理し、イルミネーションを処理しないように設定し、ライトがイルミネーションを処理し、反射(従来の "スペキュラ ハイライト" など)を処理しないように設定します。

または、エリア ライトを使用している場合は、エリア ライトがスペキュラ ハイライトを作成するように設定する別の方法もあります。

エリア ライトのスペキュラ ハイライトでも "可"

エリア ライトのスペキュラ ハイライトでも "可"

これは、別の方法を使用した場合のイメージです。左のパッチは、ここでもスペキュラがオンに設定されたポイント ライトを使用しています。これは、意図した結果とは異なり、不自然に見えます。他の 2 つのパッチはエリア ライトを使用しています。中央のパッチは、エリア ライトのスペキュラがオフに設定され、refl_contrib が 1.0 に設定されています。右のパッチは、スペキュラがオンに設定され、refl_contrib がゼロに設定されています。

ご覧のとおり、中央と右のパッチでは両方とも変数がうまく "機能" しているため、あとはエリア ライトのスペキュラをオフにするかオンにするかの問題です。

ここでは、中央のパッチの方が望ましいと言えます。これは通常、幾何学的にシンプルなエリア ライト(球、四角形など)を、実際には幾何学的に複雑な(たとえば、ネオン サイン)オブジェクトの代わりに使用するためです。このような場合は当然、オブジェクトが反射され、ライトがスペキュラ光を放出しない方法を使用します。

実際の反射を必要とする複雑なジオメトリ

実際の反射を必要とする複雑なジオメトリ

両方のネオン サインは、イルミネーションに長方形のエリア ライトを使用し、見た目のよいエリア シャドウを投影しています(小さな球を見れば分かります)。しかし、左のサインには、意味のない、露骨な四角形の "反射" があります。この場合は当然、右のネオン サインの方法を使用します。つまり、ライトのスペキュラをオフ、サーフェスの refl_contrib をゼロ以外に設定します。

複雑な光の配分

現実の世界の照明では、電球、反射物、各種遮蔽要素の間の複雑な相互作用によって、シーンの最終的な光の配分が決まります。

当然、単に卓上スタンドのレンダリングを作成するために、これらのすべての詳細を考慮するわけではなく、実際には測定データ(IES または ELUMDAT ファイル)を使用して問題を事前に解決します。

mia_light_surface シェーダは、ライトからその強度を取得できます。これにより、"可視のサーフェス" の強度とカラーを光源の強度とカラーと同期させるために要する時間を短縮できます。use_lights がオンに設定され、ライトが lights パラメータで渡される場合、これは自動的に処理されます。

これは等方性のポイント ライトなどには適していますが、ライトの測定データを使用する場合は、問題が発生する可能性があります。

ライトから強度/カラーを取得

ライトから強度/カラーを取得

上のシーンには 3 つの球体があります。これらの球体を卓上スタンドの電球のモデルと仮定しましょう。各電球には、適用された照明に一致する IES プロファイルが設定されたライトが含まれています。

左の球体は、use_lights が手動でオフに設定された mia_light_surface を使用しています。ユーザは、サーフェスの強度とカラーが "正しい" ことを確認し、アニメートされた強度の変更などと手動で同期させる必要があります。

中央の球体は、use_lights を使用していますが、電球の半分が暗くなっていて奇妙です。これは、選択した IES プロファイルが下方向にのみ光を放出するためです。光源は球体の中央にあるため、球体の下半分のみがライトの強度値を取得します。

これは明らかに望ましい結果ではありません。IES プロファイルは、照明全体に適用される複合効果であり、電球自体に "適用される" べきものではありません。

この問題の解決方法は、右の球体のように lights_eval_point を使用することです。この方法では、ライトの正面のポイント(ライト独自の座標空間内)のみが "評価ポイント" として選択されます。球体上の各ポイントには(その位置に関係なく)、空間内のそのポイントで "測定された" 強度が設定されます。

これにより、ライトの強度とカラーの変更が自動的に反映されたカラーが球体に適用されます。このカラーは、球体のサーフェス全体に均一です。この球体は、従来の "ハイライト" よりも適切な方法で正確に反射します。

mia_light_surface シェーダを使用することについてのまとめ

<i>mia_light_surface</i> の別の使用例

mia_light_surface の別の使用例


脚注
1
mia_materialrefl_falloff_dist と組み合わせて使用すると非常に役立ちます。
2
www.debevec.org 提供の "Gallileo's tomb" プローブです。問題になりそうな明るい小さな領域が多数含まれています。
3
特にビジュアル エフェクトの場合にあてはまります。