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;
}