【Maya】MayaのShaderFXでMatCapシェーダーを作る

f:id:tm8r:20170926190951p:plain
UnityでMatCapシェーダーをあてる記事は数あれど、Mayaはなかなか見かけないのでやってみます。

MatCapに関してはこちらの記事が大変参考になります。
tsubakit1.hateblo.jp

まずはWindow>Rendering Editors>HyperShadeでハイパーシェードのウィンドウを開きます。
次に、CreateタブのShaderfxShaderでシェーダーを作成。

f:id:tm8r:20170926191144p:plain
AttributeEditorで「Open ShaderFX」を選択。

するとShaderFXが立ち上がるので、まずはメニューバーのSettingsのToggle Advanced Modeをオンにします。
これをオンにしておくと、通常のモードだと表示されていなかったノードが利用できるようになります。

今回使うノードはVertexWorldNormal、TextureMap、MatCapUVs、CustomCode、Saturateです。
f:id:tm8r:20170926190828p:plain
最終的なノードの状態はこんな感じ。これに倣って接続をします。

MatCapUVsは検索しても全然それっぽい資料が見当たらないんですが、挙動を見る限りワールド法線をMatCap用によしなに加工してくれるノードだと思われます。

次はCustomCodeの編集です。
ShaderForgeやAmplifyShaderEditorなどは様々なブレンドを提供してくれるノードがあるんですが、ShaderFXではそれに相当するノードがなさそうなので、自前でブレンドのコードを書く必要があります。
f:id:tm8r:20170926191507p:plain
というわけでCustom Codeノードを選択してアトリビュートエディタで「Edit」を選択。
表示されたウィンドウで以下のようなコードを記述します。(今回はOverlay相当のコード)

struct CustomCode1399Output 
{ 
	float3 color; 
}; 

CustomCode1399Output CustomCode1399Func( float3 inputA, float3  inputB) 
{ 
	CustomCode1399Output OUT; 
	OUT.color = ( inputA.r > 0.5 && inputA.g > 0.5 && inputA.b > 0.5 ? (1.0-(1.0-2.0*(inputA.rgb-0.5))*(1.0-inputB.rgb)) : (2.0*inputA.rgb*inputB.rgb) );
	return OUT; 
} 

最後に_MainTexに通常のテクスチャを、_MatCapTexにMatCap用のテクスチャを割り当てます。
MatCap用のテクスチャは自作でもなんでもいいんですが、今回はUnityのアセットストアで配布されている「Free MatCap Shaders」のテクスチャを流用しました。
Free MatCap Shaders

あとは必要な分だけマテリアルを複製してテクスチャを割り当ててやれば完成です。

f:id:tm8r:20170926190800p:plain
やったーMatCapできたよー!

というわけで実現できたものの、こんなノードを毎回作るのは大変面倒なので、今度これを簡易化する方法について書きます(たぶん)

f:id:tm8r:20170906162925p:plain
この作品はユニティちゃんライセンス条項の元に提供されています

スポンサーリンク