「MonoGameでプログラマブルシェーダーを使う」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
== プログラマブルシェーダーのコンパイル ==
+
 
2020年5月に発表されたMonoGame 3.8.0 (preview版)からプログラマブルシェーダー周りが大幅に変更された。[[Mac]]や[[Linux]]でもビルドできるようになったぞ。
+
 
* [[MonoGame 3.8.0以降でfxファイルをコンパイルする]]
+
== MonoGame 3.8.0から ==
* [[MonoGame 3.7.1以前でfxファイルをコンパイルする]]
+
2020年5月時点の[[MonoGame]] 3.8.0 (プレビュー版)から
 +
[[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 PATH=$PATH:"/Applications/Wine Stable.app/Contents/Resources/wine/bin/"' >> ~/.profile
 +
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.profile
 +
</source>
 +
<source lang="bash">
 +
#zshの場合
 +
echo 'export PATH=$PATH:"/Applications/Wine Stable.app/Contents/Resources/wine/bin/"' >> ~/.zprofile
 +
echo 'export MGFXC_WINE_PATH="$HOME/.winemonogame"' >> ~/.zprofile
 +
</source>
 +
 
 +
MacOSからログアウトする。
 +
再起動でもいいぞ。
 +
 
 +
 
 +
== 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]]

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)