MonoGame 3.7.1以前でfxファイルをコンパイルする
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を「管理者権限で実行」する
関連項目
- fxファイルのコンパイル