このシェーダーを書く際にはdskjalさんのサイト( https://dskjal.com/ )を参考にさせていただきました。
light面用のmatcap textureとshadow面用のmatcap textureを使用して疑似的にライティングをするノードです。
実際にライトを使用する訳ではなく指定したターゲットの位置にmatcapのライト面側が向くようになります。



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

こちらからzipファイルをダウンロードして下さい。
blenderシーンと各種データが入っています。
matcap_using_target.zip
配布しているblenderファイルの説明です。
入っているオブジェクト類

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

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

matcapノードパラメーター

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

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


配布ファイルでは上側のfilePathSelにLight面用テクスチャ、下側にShadow面用テクスチャを設定しています。
Targetを使用したmapcap用ノード:指定したターゲットの方向にLight面側が向くmatcapです。
matcap_using_targetパラメーター

本体は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の位置情報を取得するノード:指定したターゲットの位置を取得するノードです。

本体はVectorMathノードのmultiply使用しています。
Driverを追加してTargetのX,Y,ZのWorldSpaceLocationを取得しています。
これをmatcapのLightLocationに接続しています。
Shadowマスク用ノード:キャストシャドウ用のノードです。

Scriptノードのshadow_mask.oslでキャストシャドウの情報を取得しています。

light_location:シャドウを計算する光源の位置を接続します。基本的には他のLightLocationと同じ物でいいです。
ShadowThreshold:シャドウの境界位置です。OSLのTraceShadowの仕様上0.0にするとブロックノイズの様になってしまうので0.1〜0.2がお勧めです。(OSLのTraceShadowはポリゴンのスムースを計算できない)
AmbientOcclusinマスク用ノード:凹み部分を暗くしたい場合に使用するノードです。

使用する場合はMixノードのColor2にmatcap用ノードのOutColorを接続してこちらのMixノードのOutColorをMaterialOutputのSurfaceに接続して下さい。

タグ:Blender