# エフェクト言語 ## C# でシェーダーを作成する @'Stride.Shaders.ShaderSource' オブジェクトを使って、シェーダーを実行時に作成することができます。シェーダーには3つのタイプがあります。 - @'Stride.Shaders.ShaderClassSource' は一意なシェーダークラスに対応します。 - @'Stride.Shaders.ShaderMixinSource' 複数の @'Stride.Shaders.ShaderSource' をミックスし、プリプロセッサの値を設定し、コンポジションを定義します。 - @'Stride.Shaders.ShaderArraySource' はコンポジションの配列として使用されます。 この方法で、実行時にシェーダーを生成することができます。しかし、プラットフォームの多くは HLSL をサポートしておらず、実行時にシェーダーをコンパイルする機能がありません。さらに、この方法ではミックスインによる再利用性の恩恵を受けることができません。 ## Stride エフェクト(SDFX) シェーダーの多くは、既存のシェーダーの変種や組み合わせです。例えば、影を落とすメッシュ、影を受けるメッシュ、スキニングが必要なメッシュなどがあります。コードを再利用するには、条件に応じて使用する部分を選択するのがよいでしょう(条件の例:「スキニングが必要」)。この問題を解決するには、「ウーバー(uber; 優れた)シェーダー」と呼ばれる、プリプロセッサのパラメータセットで設定されたモノリシックなシェーダーがよく使われます。 Stride では、拡張性と再利用性を念頭に置きつつ、同様の制御を行っています。シェーダークラスで定義されたシンプルなコードブロックは、シェーダーミキサーによって混ぜ合わせることができます。このプロセスでは、より複雑なロジックを Stride エフェクトファイル(*.sdfx)に記述し、使用することができます。 ### 一般的な文法 SDFXファイル(.sdfx)は、シェーダーの組み合わせを生成するために使われる小さなプログラムです。一連のパラメータ(コレクションのキーと値)を受け取り、コンパイル可能な `ShaderMixinSource` を生成します。 Stride エフェクトファイル(.sdfx)の例: ```cs using Stride.Effects.Data; namespace StrideEffects { params MyParameters { bool EnableSpecular = true; }; effect BasicEffect { using params MaterialParameters; using params MyParameters; mixin ShaderBase; mixin TransformationWAndVP; mixin NormalVSStream; mixin PositionVSStream; mixin BRDFDiffuseBase; mixin BRDFSpecularBase; mixin LightMultiDirectionalShadingPerPixel<2>; mixin TransparentShading; mixin DiscardTransparent; if (MaterialParameters.AlbedoDiffuse != null) { mixin compose DiffuseColor = ComputeBRDFDiffuseLambert; mixin compose albedoDiffuse = MaterialParameters.AlbedoDiffuse; } if (MaterialParameters.AlbedoSpecular != null) { mixin compose SpecularColor = ComputeBRDFColorSpecularBlinnPhong; mixin compose albedoSpecular = MaterialParameters.AlbedoSpecular; } }; } ``` ### ミックスインを追加する ミックスインを追加するには、`mixin ` を使用します。 ### パラメーターを使う 構文は C# に似ていますが、以下のルールが追加されています。 - パラメーターキーを使用する場合は、`params ` を使って追加します。そうしないと、キーは変数として扱われます。 - キーに隠れている値がどこでチェックされるかを記載する必要はありません。ただ、キーを使うだけです。 ```cs using params MaterialParameters; if (MaterialParameters.AlbedoDiffuse != null) { mixin MaterialParameters.AlbedoDiffuse; } ``` パラメータは、変数のように扱えます。パラメーターの値を読み書きしたり、値を比較したり、テンプレートパラメーターを設定することができます。パラメーターの中にはミックスインを格納しているものもあるので、コンポジションや継承にも利用できます。 ### カスタムパラメーター 構造体定義構文を使って、独自のパラメータセットを作成することができます。 >[!Note] >たとえ SDFX ファイルの中で定義されているとしても、それを使う際には `using` の記述を忘れてはいけません。 ```cs params MyParameters { bool EnableSpecular = true; // true is the default value } ``` ### コンポジション コンポジションを追加するには、以下のような構文でコンポジション変数をミックスインに割り当てます。 ```cs // albedoSpecular は,ミックスイン内のコンポジション変数の名前です。 // albedoSpecular is the name of the composition variable in the mixin mixin compose albedoSpecular = ComputeColorTexture; or mixin compose albedoSpecular = MaterialParameters.AlbedoSpecular; ``` ### 部分エフェクト コードをいくつかのサブミックスインに分割して他の場所で再利用するには、次の構文を使用します。 ```cs partial effect MyPartialEffect { mixin ComputeColorMultiply; mixin compose color1 = ComputeColorStream; mixin compose color2 = ComputeColorFixed; } // to use it mixin MyPartialEffect; mixin compose myComposition = MyPartialEffect; ``` `MyPartialEffect` ミックスインは、コード内の他のミックスインと同様に使用できます。 ## 関連項目 * [シェーディング言語](shading-language/index.md)