「MonoGameでプログラマブルシェーダーを使う」の版間の差分

提供:MonoBook
内容を「== プログラマブルシェーダーのコンパイル == 2020年5月に発表されたMonoGame 3.8.0 (preview版)からプログラマブルシェーダー周りが…」で置換
タグ: 置換
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
 
== プログラマブルシェーダーのコンパイル ==
 
2020年5月に発表されたMonoGame 3.8.0 (preview版)からプログラマブルシェーダー周りが大幅に変更された。[[Mac]]や[[Linux]]でもビルドできるようになったぞ。
== MonoGame 3.8.0から ==
* [[MonoGame 3.8.0以降でfxファイルをコンパイルする]]
2020年5月時点の[[MonoGame]] 3.8.0 (プレビュー版)から
* [[MonoGame 3.7.1以前でfxファイルをコンパイルする]]
[[Windows]]だけでなく、[[MacOS]]や[[Linux]]でも[[プログラマブルシェーダー]]の[[コンパイル]]ができるようになった。[[Mac]]や[[Linux]]では内部的に[[wine]]を用いているので若干の環境構築が必要となる。
 
=== Macでの環境構築 ===
[[xquartz]]を[[インストール]]する。
* https://www.xquartz.org/index.html
 
[[wine]]を[[インストール]]する。
この際に「64 bit support」のチェックを必ずいれること。
内部的にはwine64コマンドしか使わないので[[macOS 10.15 Catalina]]でも大丈夫。
* https://dl.winehq.org/wine-builds/macosx/download.html
 
[[7z]]を[[インストール]]する。
brew install p7zip
 
mgfxcコンパイラをインストールするスクリプトを実行する。
<source lang="bash">
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
</source>
 
mgfxcコンパイラなどは「$HOME/.winemonogame」ディレクトリに格納される。
 
環境変数を追加する。
<source lang="bash">
#bashの場合
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.profile
</source>
<source lang="bash">
#zshの場合
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.zprofile
</source>
 
== MonoGame 3.7.1まで ==
2020年4月時点の[[MonoGame]] 3.7.1では[[プログラマブルシェーダー]]([[fxファイル]])の[[コンパイル]]は「[[Windows]]上でのみ」できる。
 
逆を言えば[[Mac]]上の[[Visual Studio for Mac]]や[[Linux]]上の[[Xamarin Studio]]を使って開発している場合には[[プログラマブルシェーダー]]の[[コンパイル]]ができない。
 
これはMonoGameのコンパイラが複数の環境に対応したコードを生成する過程の問題ある。
* まず[[SharpDX]]で[[HLSL]]を[[中間コード]]に[[コンパイル]]する(これがWindows専用)。
* その中間コードを[[MojoShader]]に食わせて[[OpenGL]]形式([[GLSL]])に変換する。
 
このため現状の実装では[[Mac]]や[[Linux]]ではどうにもならない。
 
=== 解決策 ===
[[Mac]]や[[Linux]]上の[[Xamarin Studio]]で[[シェーダー]]([[fxファイル]])を使えるようにする素晴らしい[[クラウドサービス]]が登場した。その名も「[[InfinitespaceStudios.Pipeline]]」の「RemoteEffectProcessor」。
* https://www.nuget.org/packages/InfinitespaceStudios.Pipeline/
 
リモート・エフェクト・プロセッサー!
 
これは[[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のハッシュを取ってコンパイル成果物をキャッシュするようにしたり、デバッグ機能をつけたりすると捗るかもしれない。
* https://github.com/infinitespace-studios/InfinitespaceStudios.Pipeline
 
=== Windowsマシンを用意する ===
さっそく[[VirtualBox]]にWindows 10をぶち込んで環境構築してみた。
* Visual Studio をインストールする
* MonoGame をインストールする
* RemoteEffectProcessorのソースコードを落としてくる
 
Windows 10はセキュリティが厳しくなり、HttpListenerに対して外部から接続ができなかった。
色々試したがどれで上手くいったのかわからん。
* ファイアーウォールに穴をあける(デフォルトは8001番ポート)
* Visual Studioを「管理者権限で実行」する
 
 
== 関連項目 ==
* [[MonoGameでHLSLにMatrixを渡す]]
* [[HLSL]] ([[fxファイル]])
* [[シェーダー]]
 
[[category: MonoGame]]
[[category: HLSL]]

2020年6月10日 (水) 01:35時点における最新版

プログラマブルシェーダーのコンパイル[編集 | ソースを編集]

2020年5月に発表されたMonoGame 3.8.0 (preview版)からプログラマブルシェーダー周りが大幅に変更された。MacLinuxでもビルドできるようになったぞ。