Table of Contents

カスタムシェーダー

中級 プログラマー

Visual Studio で独自のシェーダーを書いて、マテリアル属性で使うことができます。例えば、オブジェクトのワールド位置に基づいてマテリアルにテクスチャーを追加するシェーダーを書いたり、ノイズを生成してマテリアルのプロパティをランダム化することに使ったりすることができます。

シェーダーはテキストファイルなので、他のコードファイルと同じようにコメントを追加したり、コードの行を有効にしたり無効にしたりと、編集することができます。そのため、メンテナンスや作業の繰り返しが容易です。

また、カスタムシェーダーを使用して、カスタムポストエフェクトを作成することもできます。詳しくは、カスタム色変換をご覧ください。

シェーダーを作成する

  1. Stride Visual Studio 拡張機能がインストールされていることを確認してください。SDSL(Stride シェーディング言語)のシェーダーファイルを.csファイルに変換するために必要です。

  2. Game Studio のツールバーの Open in IDEOpen in IDE)をクリックして、プロジェクトを Visual Studio で開きます。

  3. Visual Studio の ソリューション エクスプローラーで、プロジェクト(例:MyGame.Game)を右クリックし、[追加] > [新しい項目] を選択します。

    New item

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

    Select class

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

    Select class

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

    My shader

  6. .sdsl ファイルを開き、既存の内容を消去し、あなたのシェーダーを記述します。

    シェーダーは、HLSL をベースにした Stride Shading Language(SDSL)で記述します。詳しくはシェーディング言語をご覧ください。

    例として、緑色(RGBA 0;1;0;1)を生成するシェーダーを次に示します。

    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] をクリックして、ファイルを再読み込みします。

    Reload assemblies

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

    Shader in Asset View

    Note

    下のスクリーンショットのように、Game Studio がシェーダーを誤ってスクリプトと認識してしまう場合があります。

    Shader as script

    この場合、Game Studio を再起動してください([File] > [Reload project]).

カスタムシェーダーを使う

カスタムシェーダーは、任意のマテリアル属性で使用することができます。

  1. アセットビューで、シェーダーを適用したいマテリアルを選択します。

  2. プロパティグリッドで、シェーダーを適用したいプロパティの横にある Blue arrow buttonChange)をクリックし、Shader を選択します。

    Select Shader

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

    Type shader

    そのプロパティは、指定したシェーダーを使用します。

Tip

Visual Studioで .sdsl ファイルに変更を加えて保存すると、Game Studio は自動的にプロジェクトを変更して更新します。これが起こらない場合は、Game Studio を再起動してください([File] > [Reload project])。

Note

プロジェクトのアセットからシェーダーを削除した場合、エラーを防ぐために、シェーダーを使用するマテリアルのプロパティからもシェーダーを削除してください。

引数とパラメーター

テンプレート引数

テンプレート引数(ジェネリック)は、実行時には変更されません。ただし、異なるマテリアルは、異なるシェーダーのインスタンスを異なる値で使用することができます。

シェーダーがコンパイルされる際に、Stride は、テンプレートの引数に対応してプロパティグリッドで設定されている値を使用します。

例えば、次のコードでは、テンプレート引数 Frequency を定義し、使用しています。

shader ComputeColorWave<float Frequency> : ComputeColor, Texturing
{
    override float4 Compute()
   {           
        return sin((Global.Time) * 2 * 3.14 * Frequency);
    }
};

Template argument

パラメーター

パラメーターは、実行時の変更が可能です。

例えば,次のコードでは,動的パラメータ Frequency を定義し、使用しています。

shader ComputeColorWave: ComputeColor, Texturing
{
    cbuffer PerMaterial
    {
        stage float Frequency = 1.0f;
    }

    override float4 Compute()
    {
        return sin(( Global.Time ) * 2 * 3.14 * Frequency);
    }
};

実行時に値を変更するために、マテリアルのパラメーターコレクションにアクセスしてそこに設定します。例えば、Frequency を変更する場合は、次のようにします。

myMaterial.Passes[myPassIndex].Parameters.Set(ComputeColorWaveKeys.Frequency, MyFrequency);
Note

ComputeColorWaveKeys.Frequency は、Stride Visual Studio 拡張機能によってシェーダーファイルから生成されます。

コンポジション

このコンポジションでは、Game Studio のプロパティグリッドから Frequency を設定することができます。

shader ComputeColorWave : ComputeColor, Texturing
{
    compose ComputeColor Frequency;

    override float4 Compute()
    {
        return sin(( Global.Time ) * 2 * 3.14 * Frequency.Compute().r);
    }
};

これで、マテリアルのプロパティに値を設定できます。

Select shader

カスタムシェーダーの例

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

Sample project

このプロジェクトでは、ComputeColorWaveNormal シェーダがディスプレイスメントマップサーフェスのマテリアルプロパティに使用されています。

関連項目