見出し画像

Houdini19.0 Karma紹介 中編「Shader」

はじめに

YouTubeに説明動画をUPしておりますので、併せてご覧ください。

スライド2

訂正

----------------------------------------------------------------------

今回説明するパート

画像3

MaterialX

スライド3

Houdini19からは「MaterialX」に対応しました。
「MaterialX」はアプリケーションとレンダラー間でルック開発アセットを転送するためのオープンソースライブラリ(マテリアルレイヤリングシステム)になります。

スライド4

「MaterialX」で作成可能なマテリアルは「Surface Material」と
Volume Mateiral」の2種類に分けることが出来ます。

「Surface Material」に該当するものが「BSDF」と呼ばれる
モデルになります。
「Volume Mateiral」は「VDF」「EDF」の2つが該当します。

シェーダータイプとしましては「BSDF」「VDF」「EDF」という3パターンになります。

BSDF

スライド5

まず「MaterialX」自体は物理ベースシェーダーになります

このシェーダーを計算するときに「Bsdf」という計算方法を用いてシェーディングを行います。この「Bsdf」というのは光が物体に当たった時の反射透過を計算するための考え方(モデル)になります。「Bsdf」というモデルは「Brdf」「Btdf」の二つのモデルを組み合わせたモデルとなります。

まず「Brdf」というモデルは光源から光が物体表面に照射されて反射をします。物体表面上の反射の度合とその分布度合いのみを計算するモデルになります。

それに対して「Btdf」というモデルは、光源から光が物体表面上に当たり、その物体表面を透過していく際の屈折とその物体内部での光の分布、拡散を計算することを目的としたモデルとなります。

この二つを組み合わせることで、反射と透過素材であった場合の物体内部的な光の屈折で合ったり拡散を合わせて計算することが出来るモデルになります。

サーフェスマテリアルを計算する際に適応されるモデルです。

VDF&EDF

スライド6

一方でボリュームマテリアルとしてVDF(体積分布関数)
EDF(発光分布関数)というモデルがあります。

「VDF」はボリューム内部の光のふるまいを計算するための考え方です。外部に光源がある場合もありますし、内部に光源がある場合があります。光源から発生したレイというのは現実世界では細かい粒子の集まりなので、光源から発生したレイはその粒子一つ一つに当たって、反射、屈折を繰り返します。光が当たった際にうっすらと光っているような表現になったりすることがありますが、そのような光の振る舞いを計算するための考え方(モデル)というのが「VDF」になります。

EDF」は光源、もしくは発光体から放射される光そのもののふるまいを計算するモデルとなります。

エネルギー保存則

スライド7

サーフェスマテリアルの光の屈折や反射のように、"光"とは"電磁波"であり、これは「エネルギー」としてとらえることが出来ます。この「エネルギー」は形態が変化しても、そのもののの総量は変わることはありません
物理ベースレンダリングの場合、反射/屈折の前後で総量が異なってしまうと、かなりの数の光源を置いたとしても、モデルが暗く表示されてしまったり、逆にライトの数が少ないのに明るい、といったことが起きてしまうため、正しい結果を返すためにはこのエネルギー保存則が守られている必要があります。
「MaterialX」はこの処理を内包しているために、物理的に正しい結果が返されるよう考慮されているシェーダーになります。

MaterialX 機能制限

スライド8

ただし、「MaterialX」には現時点で上記画像内に記されている
機能制限があります。

MTLX テクスチャの読み込み

↓下のリンクから再生すると、実践している部分から再生されます↓

後編.00_05_36_16.静止画013

まずLOP上にて「Reference」ノードを使用してモデルを読み込みます。

後編.00_06_04_17.静止画015

「Reference」ノードの「Primitive Path」が「/$OS」となっているので、シーングラフツリー上ではノード名の「reference1の表記でプリミティブが作成されています。

後編.00_06_44_13.静止画016

複数のモデルを用いる際は、シーングラフパスの構造が重要になるため、プリミティブ情報を明確にするためプリミティブパスの名前を変更します。
「reference1」を「lantan」に変更し、「Primitive Path」を「/model/$OS」に変更します。
こうすることで「model」という階層の下にランタンが配置されます。

後編.00_06_51_15.静止画017

次に「Material Library」ノードを作成し、「Lantan」の下に接続します。

後編.00_07_03_24.静止画018

そして「Material Library」ノードの中に入り、
Mtlx Standard Surface VOP」を作成します。このノードをモデルに適応させていきます。

後編.00_07_32_05.静止画019

一つ上の階層に戻り、「Material Library」ノードのパラメータ
Material VOP」から先ほど作成した「Mtlx Standard Surface VOP」を選択します。(「materiallibrary1」の中に格納されています。)

後編.00_07_51_01.静止画020

次にどのモデルにマテリアルをアサインするのかを設定する必要があります。「Material Library」ノードのパラメータの「Assign to Geometry」にチェックを付けます。

後編.00_09_11_04.静止画021

有効になった「Geometry Path」に、シーングラフツリー上の「model>lantan」をドラッグアンドドロップします。
この状態にすることでマテリアルが適応されます。

後編.00_08_55_06.静止画022

ただし、現在「Material Library」ノードのパラメータの
Material PathPrefix」が「/materials」となっているため、シーングラフツリー上では「model」と別カテゴリでまとめられています。(アサインした「Mtlx Standard Surface VOP」もここに格納されています。)

後編.00_09_37_16.静止画023

冒頭でも説明した通り、複数のモデルを用いる際は、シーングラフパスの構造が重要になるため、「Material PathPrefix」を「/model/materials」に変更します。
こうすることで「model」階層の下に「materials」が配置されます。

後編.00_10_06_23.静止画024

ランタンにはテクスチャが用意されているので、アサインしていきます。「Material Library」ノード内に再び入り「Mtlx Texcoord」ノードを作成します。パラメータの「Signature」は「Vector2」に変更します。

後編.00_10_21_20.静止画025

次に「Mtlx Image」を作成します。このノードを使用することでテクスチャを読み込むことが出来るようになります。
texcoord」と「Mtlx Texcoord」の「out」を接続します。

後編.00_10_29_07.静止画026

後編.00_10_51_08.静止画027

パラメータの「Filename」から該当するテクスチャを選択した後、
「Mtlx Image」の「out」と「Mtlx Standard Surface VOP」の
base_color」を接続します。

後編.00_11_05_18.静止画028

今の工程と同じ要領でほかのテクスチャを読み込んでいきます。
「Mtlx Image」を複製しラフネスマップを読み込み、
Mtlx Image2」の「out」と「Mtlx Standard Surface VOP」の
specular_roughness」を接続します。

後編.00_11_14_06.静止画029

ラフネスマップを読み込んだ「Mtlx Image2」のパラメータ
「Signature」が「Color」になっています。
ラフネスマップはグレースケールなので「Float」に変更します。

後編.00_11_36_08.静止画030

後編.00_11_37_03.静止画031

同じ要領でメタリックを読み込んでいきます。
「Mtlx Image2(※「Signature」が「Float」)」
を複製しメタリックテクスチャを読み込み、
Mtlx Image3」の「out」と「Mtlx Standard Surface VOP」の
metalness」を接続します。

後編.00_11_56_24.静止画032

次にノーマルマップを読み込みます。
「Mtlx Image」を複製し、ノーマルマップを読み込むところまでは同じです。
追加で「Mtlx Normalmap」ノードを作成します。
Mtlx Image4」の「out」と「Mtlx Normalmap」の
in」を接続します。

後編.00_12_01_06.静止画033

「Signature」が「Float」の場合は「Color」に変更します。

後編.00_12_10_03.静止画034

「Mtlx Normalmap」の「out」と「Mtlx Standard Surface VOP」の
normal」を接続します。

後編.00_12_22_22.静止画035

このランタンのモデルはガラスの部分にオパシティがあるため、
そのテクスチャも追加していきます。
「Mtlx Image(※「Signature」が「Color」)」を複製し、
オパシティを読み込みます。
「Mtlx Image5」の「out」と「Mtlx Standard Surface VOP」の
opacity」を接続します。

後編.00_12_45_12.静止画036

以上で設定は終了となります。
一つ上の階層に戻り「Dome Light」を作成し、パラメータ「Texture」に「.hdr」マップを適応することで結果を確認することが出来ます。

Mtlx Surface VOP

スライド9

先ほどは「Mtlx Standard Surface VOP」を使用しましたが、
次は「Mtlx Surface VOP」について説明します。

このノードは入力データから光の反射と透過を計算することが出来ます。
入力に「bsdf」「edf」「opacity」が用意されています。

Mtlx Layer VOP

スライド10

また「Mtlx Layer VOP」というノードもあります。
このノードはレイヤー可能なBSDFの上にBSDFを重ねることが出来ます。

MaterialXのレイヤリングシステム

スライド12

MaterialXには「Horizonal Layering」「Vertical Layering」の二つが用意されています。

Mtlx Dielectric BSDF VOP

スライド13

Mtlx Dielectric BSDF VOP」というノードは、ガラスのような質感を表現することが出来るノードとなっています。

マイクロファセットモデルに基づいた反射と透過を計算するノードです。

Mtlx Conductor BSDF VOP

スライド14

Mtlx Conductor BSDF VOP」は、反射を計算するノードです。
金属の質感を表現したい場合このノードを使用します。
科学的な反射率、光を吸収する度合いを表す数値をパラメータに入力することが出来ます。

実践

↓下のリンクから再生すると、実践している部分から再生されます↓

後編.00_16_18_07.静止画037

まず「Mtlx  Surface VOP」「Mtlx Layer VOP」を作成し、
「Mtlx Layer VOP」の「out」と「Mtlx  Surface VOP」の「bsdf」を接続します。

後編.00_16_28_10.静止画038

Mtlx Dielectric BSDF VOP」を作成し、
「Mtlx Dielectric BSDF VOP」の「out」と「Mtlx Layer VOP」の「top」を接続します。

後編.00_16_36_15.静止画039

Mtlx Conductor BSDF VOP」を作成し、
「Mtlx Conductor BSDF VOP」の「out」と「Mtlx Layer VOP」の「base」を接続します。

後編.00_16_49_11.静止画040

後編.00_16_51_16.静止画041

一つ上の階層に戻り、「Material Library」のパラメータを確認すると、「Material  VOP」に「Mtlx Standard Surface VOP」が割り当てられてしまっているので「Mtlx  Surface VOP」に切り替えます。
そうするとモデルの質感が変わったことを確認できるかと思います。

後編.00_17_24_00.静止画042

後編.00_17_26_17.静止画043

「Material Library」の中に入り、「Mtlx Dielectric BSDF VOP」のパラメータ「ior(屈折率)」を変化させることで、下の層の鏡面は変化せず、上の層の屈折率のみ変更することが可能となります。

後編.00_18_13_10.静止画044

また実際の材質の「光物性」を適応させることが出来ます。
「光物性」とはその材質が持っている「反射率」「屈折率」「吸収係数」といった科学的な数値になります。特に金属の材質は設定が容易で、
Mtlx Conductor BSDF VOP」パラメータの「ior」「extinction」は、
デフォルトでは「Gold(金:Au)」素材の、反射した時の屈折率、光を吸収する係数をRGBに変換した値が入力されています。

後編.00_18_48_20.静止画045

金属の素材の再現方法に関すると、「RefrectiveIndex.INFO」を活用することで可能になります。

後編.00_19_02_05.静止画047

後編.00_19_02_10.静止画048

Book」から指定の素材を選択すると、数値が表示されます。
このページのどこを見ればいいのかというと、「ior」は「n」
「extinction」は「k」を参照します。
ただし、表示されている数字はRGB表記ではないので変換する必要があります。

後編.00_20_03_19.静止画049

後編.00_20_08_19.静止画050

今回は例に「アルミニウム(Al)」の数値を取得していきます。
画像左上の「Wevelength」に(R , G , B)=(0.65 , 0.55 , 0.45)の数値を
それぞれ入力し、表示された「n」「k」の値が、「ior」「extinction」のRGBの値となります。

後編.00_20_31_16.静止画051

あとはこの求めた数値を「Mtlx Conductor BSDF VOP」パラメータの「ior」「extinction」に入力することで材質の質感を再現することができます。

Karma Hair

スライド16

「Karma Hair」はHoudini19から搭載されたChiangモデルに基づいた、HairやFurの物理ベースマテリアルとなります。
このシェーダーは「ウォルト・ディズニー・アニメーション・スタジオ」で開発が行われたものとなります。

後編.00_21_27_19.静止画052

BaseColor」で色を変更することが出来ます。
また「Melanin」の値を1に近づくほど髪の色も黒色に近づきます。

Physical Lens VOP

スライド17

Physical Lens VOP」はカメラ設定とレンズ効果を追加することが出来ます。(ボケ、色収差、歪曲収差など)

後編.00_21_50_08.静止画053

後編.00_21_52_06.静止画054

Physical Lens VOP」を追加するためには、特定のシーンに
Assign Material」を作成します。

後編.00_21_59_08.静止画055

その中に「Physical Lens VOP」を作成します。
この状態ではパラメータの変更は反映されません。

後編.00_22_19_14.静止画056

後編.00_22_22_24.静止画057

反映させるためには、一つ上の階層に戻り、「Camera」ノードの設定を変更します。「Camera」パラメータの「Karma」タブを選択し、
Use Lens Shader」を「Set or Create」にして有効にします。

後編.00_22_25_14.静止画058

後編.00_22_34_24.静止画059

その下の「Lens Shader VOP」も「Set or Create」にして有効にし、
先ほど作成した「Assign Material」を選択します。

後編.00_22_49_23.静止画060

こうすることで「Physical Lens VOP」の設定が反映されるようになります。

---------------------------------------------------------------------

今回のパートは以上となります。
次回Karma紹介 後編「Render Settings&Output」に続きます。
是非ご覧ください。

画像4





いいなと思ったら応援しよう!