You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3中PointSpecularEffect创建工厂报错的解决咨询

解决WinUI 3中PointSpecularEffect创建工厂时的参数错误问题

问题核心原因

PointSpecularEffect属于光照类合成效果,必须显式设置LightPosition属性,这是该效果的必填参数。你当前的代码遗漏了这个参数,导致创建CompositionEffectFactory时触发ArgumentException。而高斯模糊、饱和度这类效果没有强制要求的位置类参数,所以可以正常工作。

修正后的完整代码

XAML部分

<Grid Name="_MainGrid">
    <Rectangle Name="_Test" Width="500" Height="500" Fill="Green"/>
</Grid>

C#代码部分

Visual visualTest = ElementCompositionPreview.GetElementVisual(_Test);
Compositor compositorTest = visualTest.Compositor;
ContainerVisual containerVisualTest = (ContainerVisual)ElementCompositionPreview.GetElementVisual(_Test);

PointSpecularEffect light = new PointSpecularEffect()
{
    Name = "Light",
    Source = new CompositionEffectSourceParameter("source"),
    LightColor = Colors.Red,
    SpecularAmount = 2,
    SpecularExponent = 2,
    // 必须添加光源位置参数,示例设置在元素中心上方
    LightPosition = new Vector3(250, 250, 100)
};

CompositionEffectFactory lightFactory = compositorTest.CreateEffectFactory(light);
CompositionEffectBrush lightBrush = lightFactory.CreateBrush();
// 为效果笔刷绑定源,获取目标元素的视觉内容作为光照输入
lightBrush.SetSourceParameter("source", compositorTest.CreateBackdropBrush());

SpriteVisual lightVisual = compositorTest.CreateSpriteVisual();
lightVisual.Size = new Vector2(500, 500);
lightVisual.Brush = lightBrush;

containerVisualTest.Children.InsertAtTop(lightVisual);

关键补充说明

  • LightPosition的Vector3参数中,前两个值对应目标元素的2D坐标(x,y),第三个值是光源的Z轴深度(值越大,光照范围越广,强度越柔和)
  • 必须通过SetSourceParameter为效果笔刷绑定输入源,这里使用CreateBackdropBrush()获取目标元素的视觉内容作为光照效果的基础
  • 所有光照类合成效果(包括PointSpotLightEffect、DirectionalLightEffect等)都有类似的必填参数要求,使用前需确认所有强制属性已配置

内容的提问来源于stack exchange,提问作者Георгий Попов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:32:38