MonoGameでプログラマブルシェーダーを使う
目次
MonoGame 3.8.0から
2020年5月時点のMonoGame 3.8.0 (プレビュー版)から Windowsだけでなく、MacOSやLinuxでもプログラマブルシェーダーのコンパイルができるようになった。MacやLinuxでは内部的にwineを用いているので若干の環境構築が必要となる。
Macでの環境構築
wineをインストールする。 この際に「64 bit support」のチェックを必ずいれること。 内部的にはwine64コマンドしか使わないのでmacOS 10.15 Catalinaでも大丈夫。
brew install p7zip
mgfxcコンパイラをインストールするスクリプトを実行する。
curl -O https://raw.githubusercontent.com/MonoGame/MonoGame/develop/Tools/MonoGame.Effect.Compiler/mgfxc_wine_setup.sh
chmod +x mgfxc_wine_setup.sh
./mgfxc_wine_setup.sh
mgfxcコンパイラなどは「$HOME/.winemonogame」ディレクトリに格納される。
環境変数を追加する。
#bashの場合
echo 'export PATH=$PATH:"/Applications/Wine Stable.app/Contents/Resources/wine/bin/"' >> ~/.profile
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.profile
#zshの場合
echo 'export PATH=$PATH:"/Applications/Wine Stable.app/Contents/Resources/wine/bin/"' >> ~/.zprofile
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.zprofile
MacOSからログアウトする。 再起動でもいいぞ。
MonoGame 3.7.1まで
2020年4月時点のMonoGame 3.7.1ではプログラマブルシェーダー(fxファイル)のコンパイルは「Windows上でのみ」できる。
逆を言えばMac上のVisual Studio for MacやLinux上のXamarin Studioを使って開発している場合にはプログラマブルシェーダーのコンパイルができない。
これはMonoGameのコンパイラが複数の環境に対応したコードを生成する過程の問題ある。
このため現状の実装ではMacやLinuxではどうにもならない。
解決策
MacやLinux上のXamarin Studioでシェーダー(fxファイル)を使えるようにする素晴らしいクラウドサービスが登場した。その名も「InfinitespaceStudios.Pipeline」の「RemoteEffectProcessor」。
リモート・エフェクト・プロセッサー!
これはfxファイルをコンパイルしてくれるオンラインサービスである。ネットが繋がっていれば利用できる。開発者はInfinitespace Studiosという英国紳士のようだ。こいつは凄い。
利用する
RemoteEffectProcessorは標準でインターネット上にサーバーが提供されている。 ただしちょっと遅い。
NuGetからパッケージを追加する
NuGetからパッケージを追加する。
InfinitespaceStudios.Pipeline
MonoGame Pipeline Toolに参照を追加する
Content.mgcbファイルをMonoGame Pipeline Toolで開き、参照を追加する。 これでfxファイルの「Processor」の選択肢に「RemoteEffectProcessor」が追加される。
packages/infinitespacestudios.pipeline/1.0.9/tools/InfinitespaceStudios.Pipeline.dll
NuGetパッケージの在り処は以下のどちらかだと思われる。
- ホームディレクトリ直下の「.nuget」という隠しディレクトリの中
- プロジェクト内の「packages」ディレクトリの中
fxファイルのプロセッサーを変更する
MonoGame Pipeline Toolでfxファイルを選ぶとプロパティ一覧の「Processor」の項目に「RemoteEffectProcessor」が追加されているのでこれを選ぶ。
公式サーバーを使う際は特に設定を変更する必要なし。
自前サーバーを使う際は各項目を書き換える。注意すべき点はローカルだとhttpsではなくhttpなくらいか。
- Protocol=http
- RemoteAddress=自前サーバーのIPアドレス
- RemotePort=8001(デフォルトは8001番ポート)
自前サーバーを構築する
RemoteEffectProcessorは標準でインターネット上にサーバーが提供されている。 ただしちょっと遅い。 また、構文エラーなどが発生した際のエラー内容がざっくりすぎて意味不明という問題点もある。
RemoteEffectProcessorのソースコードはGitHub上にてオープンソースとして公開されており自前でサーバーを立てることもできる。 中身は非常にシンプルでHTTPで受け取ったHLSLをWindows上のMonoGameコマンドラインツールでコンパイルしているだけだ。HLSLのハッシュを取ってコンパイル成果物をキャッシュするようにしたり、デバッグ機能をつけたりすると捗るかもしれない。
Windowsマシンを用意する
さっそくVirtualBoxにWindows 10をぶち込んで環境構築してみた。
- Visual Studio をインストールする
- MonoGame をインストールする
- RemoteEffectProcessorのソースコードを落としてくる
Windows 10はセキュリティが厳しくなり、HttpListenerに対して外部から接続ができなかった。 色々試したがどれで上手くいったのかわからん。
- ファイアーウォールに穴をあける(デフォルトは8001番ポート)
- Visual Studioを「管理者権限で実行」する