# シェーダーのコンパイル
初級
プログラマー
Stride は、Stride シェーダーファイル(`sdsl` および `.sdfx`)を、[グラフィックスプラットフォーム](../../platforms/set-the-graphics-platform.md)で使用されるシェーダー言語に変換します。
| プラットフォーム | シェーダー言語
| -------------- | ----
| Direct3D | HLSL
| OpenGL | GLSL
| Vulkan | SPIR-V
| iOS | OpenGL ES
Stride では、実行時(ゲームが実行されている時)またはビルド時(エディタがゲームアセットをビルドする時)に、シェーダーを変換することができます。Stride が実行時にシェーダーを生成すると、シェーダーがコンパイルされるまでレンダリングが停止します。これは通常、リリースビルドでは避けたいことです。特にモバイルプラットフォームでは CPU パワーが少ないため、停止がより目立ってしまいます。
## Stride が実行時にシェーダーを変換する方法
Stride は、実行時にどのシェーダーが使用されるかを事前に知ることができません。これは、ユーザーがマテリアルのパラメーターを変更したり、スクリプトからポストエフェクトのパラメーターを変更したりすることで、新しいシェーダーの組み合わせを生成する可能性があるからです。また、最終的なシェーダーは、実行プラットフォームのグラフィックス機能に依存します。
1. Stride は、実行時に新しいシェーダーが必要になると、データベースをチェックして、シェーダーがすでに変換済みであるかどうかを確認します。シェーダーがデータベースにあれば、Stride はそれを使用します。
2. シェーダーがまだ変換されていない場合、Stride はパッケージの**ユーザー設定**(下記参照)に応じて、ローカル(デバイス上)またはリモート(Game Studio を使用)でシェーダーをコンパイルします。
3. パッケージの**ユーザー設定**(下記参照)で **Record used effects** が有効になっている場合、Stride は新しいシェーダーが必要であることを Game Studio に通知します。
4. Game Studio は、インポートすべき新しいシェーダーがあることをユーザーに通知します。

**アセットビュー**で、[**Import Effects**] ボタンが有効化されます。

5. [**Import Effects**] ボタンをクリックすると、Game Studio は **エフェクトロク**を更新(存在しない場合は作成)し、ゲームのデータベースに追加して、それを次回のビルド時に使用します(1. 参照)。

## シェーダーのコンパイル方法を変更する
1. Game Studio の**ソリューションエクスプローラー**で、パッケージを選択し、[**Package properties**] をクリックします。

2. **プロパティグリッド**で、ユーザー設定プロパティを設定します。

**Effect Compiler** プロパティでは、シェーダーのコンパイル方法を指定します。
* **Local**: デバイス上でシェーダーを変換します。これは、ゲームのリリースバージョンで推奨されます。
* **Remote**: 開発機でシェーダーを変換します。ゲームのリリースバージョンでこれを使う理由はありません。開発機に接続できないからです。
* **LocalOrRemote**: 開発機でシェーダーを変換しますが、失敗した場合はデバイス上で変換を試みます。**Remote** と同様に、ゲームのリリースバージョンには使用できません。
* **None**: シェーダーを変換しません。データベースにないシェーダーを要求すると、アプリケーションがクラッシュしますのでご注意ください。現在のところ、この機能を使ってもアプリケーションのサイズを節約できることはないので、使用するメリットはありません。しかし、データベースにすべてのシェーダーが入っていることを確認するには便利かもしれません。ゲームがクラッシュした場合、データベースに少なくとも1つのシェーダーが欠けていることがわかるためです。
**Record used effects** を有効にすると、Game Studio は、新しいシェーダーが必要になった時点でエフェクトログに追加します。ゲームのリリースバージョンでは開発機には接続できないため、これを無効にすることをお勧めします。
## iOS 向け開発においてリモートでシェーダーをコンパイルする
iOS デバイスは PC に直接接続できないため、iOS 向けの開発では Stride シェーダーをリモートで変換する必要があります。ここで、iOS デバイス、Mac、開発用 PC 間の連携のために、Python スクリプトを使う必要があります。
1. PC と Mac が同じネットワークに接続されていることを確認してください。
2. Mac に Python をインストールします。Pythonは、[Python 公式サイト](https://www.python.org/downloads/)からダウンロードできます。
3. [ios-tcreplay.zip](media/ios-tcprelay.zip) をダウンロードして、解凍します。
4. **ターミナル**を開き、ファイルを解凍したフォルダに移動して、`stride-ios-relay.py MyPcName`(`MyPcName` は開発 PC の名前)を実行します。
>[!Tip]
>開発 PC の名前を調べるには、PC 上で Windows キーを押し、**About** と入力して **Enter** キーを押します。PC の名前は**デバイス名**として表示されます。
これで、iOS デバイスが Mac を介して PC と通信し、リモートでシェーダーを構築できるようになったはずです。
## エラーメッセージ
アプリケーションが、シェーダーをコンパイルするため、または新しいシェーダーが必要であることを通知するために Game Studio に接続しようとして失敗した場合、Visual Studio の出力に次のエラーが表示されます。
「[RouterClient]: エラーが発生しました。モード Connect を使用してコネクションルーターに接続できませんでした。System.AggregateException: 1つ以上のエラーが発生しました。---> System.Net.Sockets.SocketException: ターゲットマシンが 127.0.0.1:31254 を動的に拒否したため、接続できません。」