使用燈光

Windows App SDK 中的 Microsoft.UI.Composition API 讓你能即時製作動畫與特效。 構圖燈光在二維應用中實現了三維照明。 在這篇概述中,我們將介紹如何設定構圖燈、辨識接收每個燈光的視覺元素,以及使用效果來定義內容材質的功能。

備註

想了解 XamlLight 物件如何應用 CompositionLights 來照亮 XAML UIElement,請參見 XAML lighting

構圖光照讓你能透過以下方式創造有趣的使用者介面:

  • 燈光的轉換,獨立於場景中其他物件,以實現沉浸式場景,如音樂播放場景。
  • 能夠將物件與燈光配對,使其獨立於場景其他部分一起移動,從而實現像流暢 揭示 高亮這類情境。
  • 光線和場景整體作為一個整體進行轉換,以創造材料和深度。

構圖照明支援三個關鍵概念: 光線目標場景光影效果

CompositionLight 允許你創造各種燈光並將它們放置在對座標空間中。 這些燈光會針對你想辨識出被光照亮的視覺效果。

燈光類型

類型 說明
環境光 一種發出非定向光的光源,看起來被場景中的一切反射。
遙遠的光 一個無限大的遙遠光源,向單一方向發射光。 就像太陽一樣。
點光源 一個向四面八方發射光的點光源。 就像燈泡一樣。
SpotLight 一種會發出內外光錐的光源。 像手電筒一樣。

目標

當光源目標視覺元素(加入 目標 清單)時,視覺元素及其所有子元素都會感知並對此光源作出反應。 這可以是簡單的設定,比如把 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 上的完整 Text Shimmer 範例。

限制

在決定哪些內容將由 CompositionLight 照明時,有幾個因素需要考慮。

概念 詳細資料
環境光 在場景中加入非環境光會關閉所有現有光源。 未被非環境光鎖定的物品會顯示為黑色。 為了照亮周圍未被光線自然照射的視覺,請使用環境光與其他燈光搭配使用。
燈光數量 你可以以任何組合方式使用任意兩個非環境組合光源來瞄準你的 UI。 環境光不受限制,而聚光燈、點光源和遠距燈則受到限制。
生命週期 CompositionLight 可能會經歷生存期條件(例如:垃圾回收器可能會在使用前回收光物件)。 我們建議將燈具作為成員添加,以保持對燈具的引用,這樣可以協助應用程式管理其生命週期。
轉換 燈光必須放在介面上方的節點,該節點會使用視覺結構中的 透視變換 等效果,才能正確繪製。
目標與座標空間 座標空間是必須設定所有光屬性的視覺空間。 CompositionLight.Targets 必須位於 CoordinateSpace 樹中。

光照特性

根據所使用的光類型,光可能具有衰減和空間特性。 並非所有類型的燈都能利用所有特性。

房產 說明
色彩 光的 顏色 。 光照色彩值由 D3D 漫射、環境與鏡面定義,定義所發出的顏色。 燈光使用 RGBA 值作為燈光;不使用阿爾法色彩成分。
方向 光的方向。 光線指向的方向是相對於其 CoordinateSpace 的視覺元素來指定的。
座標空間 每個視覺元素都有隱含的三維座標空間。 X 方向是從左到右。 Y 方向是從上到下。 Z 方向是平面外的一個點。 此座標的原始點位於視覺左上角,單位為裝置獨立像素(DIP)。 燈光的偏移量是在此座標中定義的。
內錐與外錐 聚光燈會發出一個由兩部分組成的光錐:明亮的內錐和外錐。 構圖讓你能控制內外錐體的角度和顏色。
位移 光源相對於其座標空間視覺的偏移量。

備註

當多個光源投射到相同的視覺對象,或是當光源的色彩值大到超過1.0時,燈光的顏色可能會因光源色彩通道的限制而改變。

進階光照特性

房產 說明
強度 控制光的亮度。
衰減 衰減控制光的強度如何隨著由範圍屬性指定的最大距離逐漸減弱。 可使用常數、二次及線性衰減特性。

燈光入門

請依照以下一般步驟加裝燈光:

  • 建立並放置燈光:建立燈光並將其放置在指定的座標空間中。
  • 識別光源物體:將光線鎖定在相關視覺上。
  • [可選]定義個別物件對光源的反應:使用 SceneLightingEffect 搭配 EffectBrush 來自訂顯示 SpriteVisual 的光線反射。 反射的預設功能支援光源座標空間內子節點的照明。 用 SceneLightingEffect 繪製的視覺化會覆蓋該視覺的預設光照。

場景光影效果

SceneLightingEffect 用於修改 CompositionLight 鎖定的 SpriteVisual 內容所套用的預設光照。

SceneLightingEffect 經常用於材質製作。 SceneLightingEffect 是一種效果,當你想要實現更為複雜的效果時,例如啟用影像的反射屬性和/或利用法線貼圖創造出深度的錯覺。 SceneLightingEffect 提供透過使用光照屬性,如鏡面反射量和漫射量,來自訂您的用戶介面的功能。 你可以進一步透過其他效果管線中的元素來自訂光影效果,使您能獨立混合與組合不同的光影反應與您的內容。

備註

場景照明不會產生陰影;它是一種專注於2D渲染的效果。 它未考慮包含真實光照模型(包括陰影)的 3D 光照情境。

房產 說明
法線貼圖 法線貼圖會產生一種貼圖效果,指向光線的法線會變亮,而指向遠方的法線會變暗。 要為目標視覺添加法線映射,請使用 CompositionSurfaceBrush 的 LoadedImageSurface 載入法線映射資產。
環境 環境特性主要用來控制整體色彩反射。
鏡面 鏡面反射會在物體上產生高光,使其看起來閃亮。 你可以控制鏡面反射的程度以及光澤的程度。 這些特性被調整,用於創造閃亮金屬或光澤紙張等材質效果。
擴散 漫反射會將光線向各個方向散射。
反射率模型 反射模型 讓你可以選擇 Blinn Phong 和實體Blinn Phong。 如果你想要濃縮的鏡面高光,你會選擇 Physically Based Blinn Phong。

樣本(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;
}