CG飯処

腹が減ってはCGができぬ

【Maya】ShaderFXで矢印シェーダーを作る

こんにちは、シェーダー勉強中のしおむすびです。


今回は以下の記事を参考にさせていただき、MayaのShaderFXを使って同じものを作っていこうと思います。
なかなかShaderFXの日本語記事が見つからなかったりするので、もしこれからShaderFXを学ぶ方の参考になれば幸いです。
zenn.dev


実際に完成した様子はこちらです。

では、解説していきます。

手順1 : X - Y

ここは、参考記事の手順では split というノードを使っていますが、ShaderFXには同じ名前のノードがないため、代わりに VectorComponent ノードを使っています。VectorComponent ノードは、色かベクトルの各チャンネルや値を取得することができるノードです。


あとは Subtract ノードに X と Y をつなげれば完了です。

手順2 : 上下対称にする

ここは参考記事通りに進めます。最初の Subtract のところで 0.5 を引いているものの境目が真ん中ではないように見えますが、特に問題ないのでこのまま進めます。

手順3 : 二値化

ここも参考記事通りに進めます。
Fractional ノードと Step ノードでなぜこのような見た目になるのかというと、

  • Fractional ノードは小数部分(x - floor(x))を返すノードなので、「X-Y = 0」の箇所のみ黒くなる
  • Step ノードは 「edge(上につなげた値) > x(下につなげた値) ? 0.0 : 1.0」 を返すので、Fractional ノードでの結果が0.5よりも大きいところは黒、それ以外は白で描画される

というのが理由です。

手順4 : 着色

参考記事ではLerpを使っていますが、ShaderFXにはLerpノードは存在しません。
代わりのノードとして Interpolate Smooth ノードがありますが、試してみたところうまくいかなかったので、今回は単純にAddノードで対応しました。
(白ではないところに色を付けたいだけなので、基本的に加算すれば色が付きます。(白の箇所は1なので、これ以上加算されても白以外にはならない))

手順5 : 矢印を動かす

こちらは参考記事通りにTimeノードをAddノードで繋げます。

色を出力する

最後に、色をPixelColorとして出力するために、 VectorConstruct を使って float4 に変換します。
以下のスクショに Baseline というノードがありますが、これは独自に作っているグループノードで、Hardware Shaderへの接続部分をまとめています。
これに関しての解説はまた別記事を書こうと思います。
(中身も別途スクショで貼っておきます)


完成!

このgifではポリゴンプレーンを何枚か並べ、それぞれにこのシェーダーを割り当てることで連続した矢印の見た目になっています。
一つのポリゴンプレーンでこれを実現する方法がちょっとわからなかったので、もしわかる方がいましたら教えていただきたいです。


これを応用して、マリオカートダッシュパネルも作れそうですね。
また別のシェーダーも試して作っていこうと思います!