# カスタムシェーダー
中級
プログラマー
Visual Studio で独自のシェーダーを書いて、[マテリアル属性](../materials/material-attributes.md)で使うことができます。例えば、オブジェクトのワールド位置に基づいてマテリアルにテクスチャーを追加するシェーダーを書いたり、ノイズを生成してマテリアルのプロパティをランダム化することに使ったりすることができます。
シェーダーはテキストファイルなので、他のコードファイルと同じようにコメントを追加したり、コードの行を有効にしたり無効にしたりと、編集することができます。そのため、メンテナンスや作業の繰り返しが容易です。
また、カスタムシェーダーを使用して、カスタムポストエフェクトを作成することもできます。詳しくは、[カスタム色変換](../post-effects/color-transforms/custom-color-transforms.md)をご覧ください。
## シェーダーを作成する
1. [Stride Visual Studio 拡張機能](../../get-started/visual-studio-extension.md)がインストールされていることを確認してください。SDSL([Stride シェーディング言語](index.md))のシェーダーファイルを`.cs`ファイルに変換するために必要です。
2. Game Studio のツールバーの (**Open in IDE**)をクリックして、プロジェクトを Visual Studio で開きます。
3. Visual Studio の **ソリューション エクスプローラー**で、プロジェクト(例:*MyGame.Game*)を右クリックし、[**追加**] > [**新しい項目**] を選択します。

4. **クラス** を選択します。

5. **名前**を指定します。拡張子を `.cs` から `.sdsl` に変更して(例:*MyShader.sdsl*)、[**追加**] をクリックします。

すると、Stride Visual Studio 拡張機能が、`.sdsl` ファイルから `.cs` ファイルを自動生成します。ソリューション エクスプローラーでは、生成された `.cs` ファイルが `.sdsl` ファイルの子として追加されているのを確認することができます。

6. `.sdsl` ファイルを開き、既存の内容を消去し、あなたのシェーダーを記述します。
シェーダーは、HLSL をベースにした Stride Shading Language(SDSL)で記述します。詳しくは[シェーディング言語](shading-language/index.md)をご覧ください。
例として、緑色(`RGBA 0;1;0;1`)を生成するシェーダーを次に示します。
```cs
namespace MyGame
{
shader MyShader : ComputeColor
{
override float4 Compute()
{
return float4(0, 1, 0, 1);
}
};
}
```
>[!Note]
>シェーダーの名前(例:上記の `MyShader` の部分)がファイル名と同じであることを確認してください。
>[!Note]
>Game Studio のプロパティグリッドからアクセスできるように、シェーダーは `ComputeColor` を継承する必要があります。
>`ComputeColor` は常に float4 の値を返すので、float の値が必要なプロパティ(metalnessやgloss マップなど)は、`ComputeColor` が返す float4 値の第一成分(赤の成分)を使用します。
7. ソリューションのすべてのファイルを保存します([**ファイル**] > [**すべて保存**])。
8. Game Studio で次のようなメッセージが表示されるので、[**Reload**] をクリックして、ファイルを再読み込みします。

**アセットビュー**に、スクリプトと同じディレクトリ(例:**MyGame.Game**)にあるシェーダーが表示されます。

>[!Note]
>下のスクリーンショットのように、Game Studio がシェーダーを誤ってスクリプトと認識してしまう場合があります。
>
>この場合、Game Studio を再起動してください([**File**] > [**Reload project**]).
## カスタムシェーダーを使う
カスタムシェーダーは、任意の[マテリアル属性](../materials/material-attributes.md)で使用することができます。
1. **アセットビュー**で、シェーダーを適用したいマテリアルを選択します。
2. **プロパティグリッド**で、シェーダーを適用したいプロパティの横にある (**Change**)をクリックし、**Shader** を選択します。

3. フィールド欄に、カスタムシェーダーの名前(*MyShader* など)を入力します。

そのプロパティは、指定したシェーダーを使用します。
> [!Tip]
> Visual Studioで `.sdsl` ファイルに変更を加えて保存すると、Game Studio は自動的にプロジェクトを変更して更新します。これが起こらない場合は、Game Studio を再起動してください([**File**] > [**Reload project**])。
> [!Note]
> プロジェクトのアセットからシェーダーを削除した場合、エラーを防ぐために、シェーダーを使用するマテリアルのプロパティからもシェーダーを削除してください。
## 引数とパラメーター
### テンプレート引数
[テンプレート引数](shading-language/templates.md)(ジェネリック)は、実行時には変更されません。ただし、異なるマテリアルは、異なるシェーダーのインスタンスを異なる値で使用することができます。
シェーダーがコンパイルされる際に、Stride は、テンプレートの引数に対応してプロパティグリッドで設定されている値を使用します。
例えば、次のコードでは、テンプレート引数 `Frequency` を定義し、使用しています。
```cs
shader ComputeColorWave : ComputeColor, Texturing
{
override float4 Compute()
{
return sin((Global.Time) * 2 * 3.14 * Frequency);
}
};
```

### パラメーター
パラメーターは、実行時の変更が可能です。
例えば,次のコードでは,動的パラメータ `Frequency` を定義し、使用しています。
```cs
shader ComputeColorWave: ComputeColor, Texturing
{
cbuffer PerMaterial
{
stage float Frequency = 1.0f;
}
override float4 Compute()
{
return sin(( Global.Time ) * 2 * 3.14 * Frequency);
}
};
```
実行時に値を変更するために、マテリアルのパラメーターコレクションにアクセスしてそこに設定します。例えば、`Frequency` を変更する場合は、次のようにします。
```cs
myMaterial.Passes[myPassIndex].Parameters.Set(ComputeColorWaveKeys.Frequency, MyFrequency);
```
> [!Note]
> `ComputeColorWaveKeys.Frequency` は、Stride Visual Studio 拡張機能によってシェーダーファイルから生成されます。
### コンポジション
この[コンポジション](shading-language/composition.md)では、Game Studio のプロパティグリッドから `Frequency` を設定することができます。
```cs
shader ComputeColorWave : ComputeColor, Texturing
{
compose ComputeColor Frequency;
override float4 Compute()
{
return sin(( Global.Time ) * 2 * 3.14 * Frequency.Compute().r);
}
};
```
これで、マテリアルのプロパティに値を設定できます。

## カスタムシェーダーの例
カスタムシェーダーの例として、Stride に同梱されている **custom material shader** サンプルプロジェクトを参照してみてください。

このプロジェクトでは、**ComputeColorWaveNormal** シェーダが**ディスプレイスメントマップ**と**サーフェス**のマテリアルプロパティに使用されています。
## 関連項目
* [シェーディング言語](shading-language/index.md)
* [カスタム色変換](../post-effects/color-transforms/custom-color-transforms.md)
* [マテリアル属性](../materials/material-attributes.md)
* [Stride Visual Studio 拡張機能](../../get-started/visual-studio-extension.md)