ライトの使用

Windows App SDK の Microsoft.UI.Composition API を使用すると、リアルタイムのアニメーションと効果を作成できます。 コンポジション照明は、2D アプリケーションで 3D 照明を可能にします。 この概要では、コンポジション ライトを設定する方法、各ライトを受け取るビジュアルを識別する方法、効果を使用してコンテンツのマテリアルを定義する方法の機能について説明します。

XamlLight オブジェクトが CompositionLights を適用して XAML UIElements を照らす方法については、XAML ライティングに関する記事を参照してください。

コンポジション照明を使用すると、次の機能を使用して興味深い UI を作成できます。

  • 音楽再生シーンなどのイマーシブ なシナリオを可能にする、シーン内の他のオブジェクトに依存しないライトの変換。
  • オブジェクトをライトとペアリングして、シーンの残りの部分から独立して移動し、Fluent Reveal の強調表示などのシナリオを有効にする機能。
  • ライトとシーン全体を一つのグループとして変換し、マテリアルと深みを生み出す。

コンポジション照明は、 ライトターゲットSceneLightingEffect の 3 つの主要な概念をサポートしています。

"ライト"

CompositionLight を使用すると、さまざまなライトを作成し、座標空間に配置できます。 これらのライトは、ライトによって照らされることを目的とするビジュアルを対象としています。

ライトタイプ

タイプ 説明
AmbientLight シーン内のすべての要素によって反射されて表示される非方向光を放出する光源。
DistantLight 単一方向に光を放出する無限に大きな離れた光源。 太陽のように。
PointLight すべての方向に光を放出する光源。 電球のように。
スポット ライト 光の内側と外側の円錐を放出する光源。 懐中電灯のように。

Targets

ライトがビジュアルをターゲットとする場合 ( ターゲット リストに追加)、ビジュアルとそのすべての子孫は、この光源を認識し、応答します。 これは、ツリーのルートに PointLight ソースを設定するのと同じくらい簡単で、以下のすべてのビジュアルはポイント ライトの方向のアニメーションに反応します。

ExclusionsFromTargets を使用すると、ターゲットの追加と同様の方法で、ビジュアルまたはビジュアルのサブツリーの照明を削除できます。 除外されたビジュアルによって影響を受けるツリー内の子は、その結果点灯しません。

サンプル (ターゲット)

次のサンプルでは、PointLight を使用して XAML TextBlock をターゲットにします。

    _pointLight = _compositor.CreatePointLight();
    _pointLight.Color = Colors.White;
    _pointLight.CoordinateSpace = text; //set up co-ordinate space for offset
    _pointLight.Targets.Add(text); //target XAML TextBlock

ポイント ライトのオフセットにアニメーションを追加することで、シリング効果を簡単に実現できます。

_pointLight.Offset = new Vector3(-(float)TextBlock.ActualWidth, (float)TextBlock.ActualHeight / 2, (float)TextBlock.FontSize);

詳細については、GitHub の 完全なテキスト シマー サンプルを参照してください。

制約

CompositionLight によってどのコンテンツが点灯するかを決定する際には、いくつかの要因を考慮する必要があります。

概念 詳細情報
アンビエント ライト 非アンビエント ライトをシーンに追加すると、既存のすべてのライトがオフになります。 非アンビエント ライトの対象ではない項目は黒で表示されます。 自然な方法で光の対象とされていない周囲の視覚エフェクトを照らすには、周囲光を他のライトと組み合わせて使用します。
ライトの数 任意の組み合わせで任意の 2 つの非アンビエントコンポジション ライトを使用して、UI をターゲットにできます。 周囲光は制限されていません。スポット、ポイント、および離れたライトがあります。
一生 CompositionLight の有効期間条件が発生する場合があります (例: ガベージ コレクターは、ライト オブジェクトを使用する前にリサイクルすることがあります)。 アプリケーションが存続期間を管理するのに役立つメンバーとして照明を追加し、その照明への参照を保持することをお勧めします。
変換 適切に描画するには、視覚構造の パースペクティブ変換 などの効果を使用する UI の上のノードにライトを配置する必要があります。
ターゲットと座標空間 CoordinateSpace は、すべてのライトのプロパティを設定する必要があるビジュアル空間です。 CompositionLight.Targets は CoordinateSpace ツリー内にある必要があります。

照明のプロパティ

使用するライトの種類に応じて、ライトは減衰と空間のプロパティを持つことができます。 すべての種類のライトですべてのプロパティが使用されるわけではありません。

財産 説明
ライトの 。 照明の色の値は、出力される色を定義する D3D 拡散、アンビエント、および反射によって定義されます。 照明はライトに RGBA 値を使用します。アルファ カラー コンポーネントは使用されません。
方向 光の方向。 ライトがポイントする方向は、 その CoordinateSpace ビジュアルを基準にして指定されます。
座標空間 すべてのビジュアルには、暗黙的な 3D 座標空間があります。 X 方向は左から右です。 Y 方向は上から下に向いています。 Z 方向は平面から外れている点です。 この座標の元のポイントはビジュアルの左上隅であり、単位はデバイス独立ピクセル (DIP) です。 ライトのオフセットはこの座標で定義されます。
内側と外側の円錐 スポットライトは、明るい内側の円錐と外側の円錐の 2 つの部分を持つ光の円錐を出力します。 コンポジションを使用すると、内側と外側のコーンの角度と色を制御できます。
オフセット 座標空間 Visual を基準とした光源のオフセット。

複数のライトが同じビジュアルにヒットした場合、またはライトのカラー値が 1.0 を超えるほど大きくなると、ライトのカラー チャネルがクランプされるため、ライトの色が変わる可能性があります。

高度な照明プロパティ

財産 説明
強度 ライトの明るさを制御します。
減衰 減衰は、範囲プロパティで指定された最大距離に向かってライトの強度を下げる方法を制御します。 定数、2 次および線形減衰プロパティを使用できます。

照明の基礎から始める

ライトを追加するには、次の一般的な手順に従います。

  • ライトを作成して配置する: ライトを作成し、指定した座標空間に配置します。
  • 照明するオブジェクトを識別する: 関連するビジュアルでライトをターゲットに設定します。
  • [省略可能]個々のオブジェクトがライトにどのように反応するかを定義する: EffectBrush で SceneLightingEffect を使用して、SpriteVisual を表示するための光の反射をカスタマイズします。 リフレクションのデフォルト設定は光源のCoordinateSpace内の子要素の照明をサポートします。 SceneLightingEffect で描画されたビジュアルは、そのビジュアルの既定の照明を上書きします。

シーンの照明エフェクト

SceneLightingEffect は、CompositionLight を対象とする SpriteVisual のコンテンツに適用される既定の照明を変更するために使用されます。

SceneLightingEffect は、マテリアルの作成に頻繁に使用されます。 SceneLightingEffect は、画像の反射プロパティを有効にしたり、法線マップで奥行きの錯覚を与えたりするなど、より複雑な処理を行う場合に使用される効果です。 SceneLightingEffect は、反射や拡散量などの照明プロパティを使用して UI をカスタマイズする機能を提供します。 効果パイプラインの残りの部分で照明効果をさらにカスタマイズし、コンテンツと異なる照明反応を個別にブレンドして構成することができます。

シーン照明は影を生成しません。これは、2D レンダリングに焦点を当てた効果です。 影を含む実際の照明モデルを含む 3D 照明シナリオは考慮されません。

財産 説明
法線マップ NormalMaps は、テクスチャの効果を生み出します。このテクスチャでは、ライトを指す法線が明るくなり、ライトから離れる法線が暗く見えるようになります。 ターゲット ビジュアルに NormalMap を追加するには、LoadedImageSurface を使用して CompositionSurfaceBrush を使用して NormalMap アセットを読み込みます。
アンビエント アンビエント プロパティは、ほとんどの場合、全体的な色の反射を制御するために使用されます。
スペキュラ 反射反射では、オブジェクトにハイライトが作成され、光沢のある外観になります。 反射のレベルと光沢のレベルを制御できます。 これらのプロパティは、光沢のある金属や光沢のある紙のような材料効果を作成するために操作されます。
拡散 拡散反射は、光をすべての方向に散乱させます。
反射率モデル 反射率モデル では、ブリンフォン と物理ベースのブリンフォンの間で選択することができます。 反射ハイライトを凝縮したい場合は、物理ベースのブリンフォンを選択します。

サンプル (SceneLightingEffect)

次のサンプルは、SceneLightingEffect に法線マップを追加する方法を示しています。

CompositionBrush CreateNormalMapBrush(ICompositionSurface normalMapImage)
{
    var colorSourceEffect = new ColorSourceEffect()
    {
        Color = Colors.White
    };
    var sceneLightingEffect = new SceneLightingEffect()
    {
        NormalMapSource = new CompositionEffectSourceParameter("NormalMap")
    };

    var compositeEffect = new ArithmeticCompositeEffect()
    {
        Source1 = colorSourceEffect,
        Source2 = sceneLightingEffect,
    };

    var factory = _compositor.CreateEffectFactory(sceneLightingEffect);

    var normalMapBrush = _compositor.CreateSurfaceBrush();
    normalMapBrush.Surface = normalMapImage;
    normalMapBrush.Stretch = CompositionStretch.Fill;

    var brush = factory.CreateBrush();
    brush.SetSourceParameter("NormalMap", normalMapBrush);

    return brush;
}