ということをしましたので、備忘録。
Unityのシェーダーは"UnityCG.cginc"などによって難しい処理をカバーしていて、かなりラクできるようになっています。3dsMaxで書く場合はそう言った部分を自分でやらないといけないのと、3dsMax独自のセマンティクス等もあるみたいでさあ、どうしていきましょう。
※なお、UniytCG.cgincなどは以下のフォルダにあります。
C:\Program Files\Unity2017.1.2f1\Editor\Data\CGIncludes
このフォルダには他にもLighting.cgincだったりいろいろ宣言してあります。
そんなわけで、まず、3dsMaxのfxファイルサンプルを見てみます。
C:\Program Files\Autodesk\3ds Max 2016\maps\fx
はい。さっぱりわかりませんでした。というか正しく動作しないものがあるのはなぜ?そんな不正確なものを参考にしていたらストレスがたまって確実にお腹をこわします。ので、3dsMax上でノードを組んでシェーダーを作れるShaderFXを利用し、自分の知りたい部分だけhlslソースに書き出して参考にする手順で作っていきました。(あくまで今回はUnityのシェーダーを移植する必要があったからこうやってますが、1から作るんだったらShaderFXでがんがん組んでもいいと思います)
図1.コンパクトマテリアルエディタ。Mayaラーとしては使いにくい…
まず、3dsMaxのコンパクトマテリアルエディタを開きます。図1-1.のボタンで、マテリアルをDirectXシェーダにします。次に図1-2のボタンで、ShaderFXウィンドウを開きます。
ここで、自分の知りたい機能だけ適当に組んでいきます。とりあえず私は「カメラの向き」や「Lightの向き」、「ワールド座標での法線」、「3dsmaxのUIに公開するブールパラメータ」、「ノーマルマップの貼り方」などを知りたかったので、ちゃちゃっと組みました。ここはだいたいどんなソフトでも似たような感じなので、ノードベースで組める人ならすぐ出来ると思います。
Tabキーでノードを探せるようでしたので、ひたすら欲しいノードを配置していきます。これは便利。
図2.適当に組んだ。
図3.HLSLとしてエクスポートする方法
HLSLファイルをエクスポートします。図3-1.のMaterialノードを選択します。右側のPropertiesウィンドウのFileNameに保存先を指定してとSave to Diskボタン(図3-2)で書き出します。
※ちなみに上みたいにきれいにノードをつながなくてもノードをおくだけで、書き出されたファイルには変数とかきちんと用意されてました。(図2でいうBoolとか)
次