2021年02月12日

matcapを使用して疑似的にライティングするシェーダー

OSLでmatcapでライティングするシェーダーを作りました。
このシェーダーを書く際にはdskjalさんのサイト( https://dskjal.com/ )を参考にさせていただきました。

light面用のmatcap textureとshadow面用のmatcap textureを使用して疑似的にライティングをするノードです。
実際にライトを使用する訳ではなく指定したターゲットの位置にmatcapのライト面側が向くようになります。
matcap_front_001.jpg

matcap_back_001.jpg


matcap_target_001.jpg


blenderで作ってますがOSLが使えるレンダラーなら使用できると思います。
各ソフトによって調整は必要ですが。
例えばmayaだとincomingベクターがblenderと逆になるので-1を乗算する必要があります。

blenderでOSLを使用するにはRenderEngineをCyclesに設定してOpenShadingLanguageにチェックを入れます。
cycles_001.jpg

こちらからzipファイルをダウンロードして下さい。
blenderシーンと各種データが入っています。
matcap_using_target.zip

配布しているblenderファイルの説明です。

入っているオブジェクト類
blender_objects_001.jpg
matcap_sphere:matcapマテリアルが設定してある球体です。
Target:matcapの向くターゲットです。
Cube_for_cast_shadow:影を落とすテストの為のオブジェクトです。


matcapマテリアルの説明
matcap_node_description_001.jpg

普通のmatcap用ノード:所謂普通のmatcap用のノードです。使用する場合はResultをMaterialOutputに接続して下さい。
matcap_001.jpg

matcapノードパラメーター
matcap_node_001.jpg

本体はScriptノードでmatcap_blender.oslというoslファイルを読み込んでいます。
FileTex:matcapに使用する画像のパスを拡張子まで入力します。絶対パスでも相対パスでもどちらでも大丈夫です。
ImageTextureノードは使用できないので注意して下さい。
Gamma:画像のガンマ値です。sRGBは0.4545、Linearは1.0です。必要に応じて色の調整等に使用して下さい。

Textureパス設定用ノード:matcapに使用するテクスチャのパスを設定します。
filePathSelノードパラメーター
filePathSel_001.jpg

本体はScriptノードでfilePathSel.oslというoslファイルを読み込んでいます。
このノードはTextureのパスを6個までストアしておけるノードです。
Numberで選択されているTextureパスをoutputします。上から1〜6です。
正確にはstring型データをoutputするので文字列ならなんでもストアしておけます。expressionとかにも使えるかも。

ResultをmatcapのfileTexに接続します。
filePathSel_002.jpg

matcap_node_description_002.jpg
配布ファイルでは上側のfilePathSelにLight面用テクスチャ、下側にShadow面用テクスチャを設定しています。

Targetを使用したmapcap用ノード:指定したターゲットの方向にLight面側が向くmatcapです。
matcap_using_targetパラメーター
matcap_using_target_001.jpg

本体はScriptノードでmatcap_using_target.oslというoslファイルを読み込んでいます。
FileTexFront:Light面用のmatcapに使用する画像のパスを拡張子まで入力します。絶対パスでも相対パスでもどちらでも大丈夫です。
FileTexBack:Shadow面用のmatcapに使用する画像のパスを拡張子まで入力します。絶対パスでも相対パスでもどちらでも大丈夫です。
Gamma:画像のガンマ値です
AreaFront:Light面のmatcap画像を拡大します。疑似的にライトの強度が強くなるような表現が出来ます。画像の端が切れるので1.0未満には出来ません。1.0〜2.0が有効範囲です。
AreaBack:Shadow面のmatcap画像を拡大します。画像の端が切れるので小さくは出来ません。画像の端が切れるので1.0未満には出来ません。1.0〜2.0が有効範囲です。
Threshold:Light面とShadow面の境界位置を調整します。0.5が中央位置です。有効範囲は1.0〜0.0ですが、Smooth値が入っているとその差分は増えます。
Smooth:境界のボケ幅です。



FlattenNormal:1.0に近くなる程matcapの計算に使用する法線情報がflatになります。
1.0で完全なflat面になります。
主にToon系モデルで鼻や口周りに不要なシェーディングが出るのを防ぐ為に付けました。
マスクテクスチャを接続して部分的にをコントロールしたり、顔のマテリアルに少量数値を入れて不要なシェーディングを出にくくしたり出来ます。



LightLocation:matcapの向くターゲットの位置情報を接続します。
Targetの位置情報を取得するノード:指定したターゲットの位置を取得するノードです。
matcap_target_position_001.jpg
本体はVectorMathノードのmultiply使用しています。
Driverを追加してTargetのX,Y,ZのWorldSpaceLocationを取得しています。
これをmatcapのLightLocationに接続しています。

Shadowマスク用ノード:キャストシャドウ用のノードです。
matcap_target_shadow_mask_001.jpg

Scriptノードのshadow_mask.oslでキャストシャドウの情報を取得しています。
matcap_target_shadow_mask_002.jpg
light_location:シャドウを計算する光源の位置を接続します。基本的には他のLightLocationと同じ物でいいです。
ShadowThreshold:シャドウの境界位置です。OSLのTraceShadowの仕様上0.0にするとブロックノイズの様になってしまうので0.1〜0.2がお勧めです。(OSLのTraceShadowはポリゴンのスムースを計算できない)



AmbientOcclusinマスク用ノード:凹み部分を暗くしたい場合に使用するノードです。
matcap_target_AO_mask_001.jpg
使用する場合はMixノードのColor2にmatcap用ノードのOutColorを接続してこちらのMixノードのOutColorをMaterialOutputのSurfaceに接続して下さい。
matcap_target_AO_mask_002.jpg
タグ:Blender
posted by KAZZ at 01:21| Comment(0) | TrackBack(0) | Free Model Library