Maya用 DirectX Shader (hlsl) の使い方 ビルド編

mayaで hlslシェーダを使用する際、シェーダファイルにはテキスト形式もしくはバイナリを選ぶことができる。シェーダファイルをコンパイルしバイナリにすると読み込みが早くなる。その手順を紹介する


目次


Autodesk MayaAutodesk 3DSMax ではシェーダに DirectX11 (hlsl)を使用することができる。このとき、シェーダファイルに、テキストファイルを使用するか、コンパイル済のバイナリを使用するかの選択肢がある。コンパイル済のバイナリを用いるほうが読み込み速度の観点で圧倒的有利である。しかし、どのようにコンパイルしバイナリを用意するのかについては、ビルド成果物であるサンプルファイルが存在するのみで、具体的手順を解説した情報はない。

そこでこの記事では、シェーダファイルのコンパイル方法について書き残す。なおhlslの導入解説は行わないので`別記事` (気が向いたら書く) 情報にあたっていただきたい。 DirectXを扱うため Windows環境についての情報となる。

環境

動作確認を行っている環境は記事執筆時点で

  • Windows10
  • Maya 2020 - 2023
  • Direct3D Shader Compiler 10.1

コンパイラ

まずはビルドに必要なコンパイラを用意する。コンパイラは fxc.exe。単体で提供されていないため、何らかの手段でインストールする必要がある。VisualStudio や BuildTools を既に使用している場合、Windows SDKとともにインストールされていると思われる。C:\Program Files (x86)\Windows Kits\10\bin\ 以下を fxc.exe で検索し、存在しないようであれば BuildToolsのセットアップで sdk を明示的に指定しインストールを行うとよい。

ビルド

コマンド例

fxc.exe effect.fx /Fo effect.fxo /I .\ /T fx_5_0 /Gec /D _MAYA_=1

コマンド内容

fxc.exe {入力ファイルパス} /Fo {出力ファイルパス} /I {インクルードフォルダ} /T シェーダプロファイル名 /Gec /D {プリプロセッサマクロ}
  • 入力ファイルパス : コンパイルしたいファイルのパスを指定
  • 出力ファイルパス: 出力するファイルのパス
  • インクルードフォルダ#include する際の基点。複数指定可能。無指定だと何も見に行かない(カレントフォルダすらみない)ため、明示的に指定、/I .\ でカレントフォルダをインクルードする必要がある。また、パス解決の挙動が maya / unity / fxc で異なるため、差異をここで吸収するためにも使用できる。
  • シェーダプロファイル名: コンパイル対象が何であるかを指定する。単一の機能ではなく全体に機能するエフェクトファイルとするため fx_5_0 (Direct3D 11 のエフェクト)を指定する
  • プリプロセッサマクロ: maya外から maya用としてコンパイルするため _MAYA_ を定義してやる。いわゆるシェーダバリアントを用意する際にも使用できる。

ここに解説しない他の各オプションは fxc.exe /? で閲覧可能なコマンドのヘルプや参考リンクを参照いただきたい。

はまりどころ

  • fxc の /Tオプション のヘルプには fx_5_0 が記載されていないが、実は機能する
  • DirectXにおける エフェクト の指すものが一般的な意味と乖離している

参考リンク

  • https://learn.microsoft.com/ja-jp/windows/win32/direct3dhlsl/specifying-compiler-targets
  • https://learn.microsoft.com/ja-jp/windows/win32/direct3dtools/dx-graphics-tools-fxc-syntax#profiles

以上。