个人资料

跳过导航链接首页 > 博客列表 > 博客正文

使用win2d为图片添加光效特效

分类:

win2d添加普通特效挺简单的,但是添加光效需要进行一些组合.

微软提供了 CompositeEffect API 提供使用.

但是最近比较烦,示例代码越看越烦,还是自己用win2d组合一下吧.

基本思路:

win2d的光效主要是分为

点光源          /          漫反射

光斑光源      /           镜面反射

当然还有其他的,这里我也没研究了.上面的特效连线一下主要分为

点光源漫反射--------PointDiffuse

点光源镜面反射--------PointSpecular

光斑漫反射--------SpotDiffuse

光斑镜面反射--------SpotDiffuse


然后像上面的四个还可以组合,比如 镜面点光源和光斑xx光源组合一下,这个在windows composition samples 里面展示了,可以下载看一下.上面的四种我只写了两种,因为懒


点光源镜面反射--------PointSpecular

光斑漫反射--------SpotDiffuse

选这两种是因为感觉效果有点代表性.下面是代码:


		public async Task<CanvasImageSource> PointSpecularEffect()
		{


			imageSource = new CanvasImageSource(device, ImageWidth, ImageHeight, devicedpi);


			using (var readStream = await storageFile.OpenReadAsync())
			{
				cbi = await CanvasBitmap.LoadAsync(device, readStream);
			}

			var heightMap = new LuminanceToAlphaEffect
			{
				Source = cbi,
			};

			_pointSpecularEffect = new PointSpecularEffect
			{
				Source = heightMap,
				LightPosition = new Vector3(100, 100, 100),
				SpecularAmount = 0.9f,
				SpecularExponent = 50,

			};

			_pointSpecularArithmetic = new ArithmeticCompositeEffect
			{

				Source1 = _pointSpecularEffect,
				Source1Amount=1,
				Source2 = cbi,
				Source2Amount=1,
				//MultiplyAmount=0,
			};
	

			using (CanvasDrawingSession ds = imageSource.CreateDrawingSession(Colors.Transparent))
			{
				ds.Clear(Colors.Transparent);
				ds.DrawImage(_pointSpecularArithmetic);
			}
			return imageSource;
		}



代码里面内部变量在外部定义的(为了后续更快地调用),移植的话添加一下缺少的 var


上面的代码用了三个特效组合: 

1.镜面反射需要一个heightmap,

2.然后需要一个点光源光效特效,

3.最后合成特效

返回ImageSource直接可以赋值给Image控件的Source属性.

如果使用漫反射,就简单些,直接贴代码,不解释了.

这些纯win2d特效代码也不需要定义canvas控件.

----------------------------------


		public async Task<CanvasImageSource> DrawSpotLightEffect()
		{

			
			imageSource = new CanvasImageSource(device, ImageWidth, ImageHeight, devicedpi);

			using (var readStream = await storageFile.OpenReadAsync())
			{

				cbi = await CanvasBitmap.LoadAsync(device, readStream);
				//var heightMap = new LuminanceToAlphaEffect
				//{
				//	Source = cbi,
				//};

				_spotDiffuseEffect = new SpotDiffuseEffect
				{
					Source =cbi,
					LightPosition = new Vector3(100, 100, 100),
					LightTarget = new Vector3(100, 100, 0),
					DiffuseAmount=0.4f,
					LimitingConeAngle = (float)Math.PI * 0.5f,
				};


				_spotDiffuseArithmetic = new ArithmeticCompositeEffect
				{
					Source1 = cbi,
					Source2 = _spotDiffuseEffect,
					Source1Amount =1,
					Source2Amount=1,
				};

				using (CanvasDrawingSession ds = imageSource.CreateDrawingSession(Colors.Transparent))
				{
					ds.Clear(Colors.Transparent);
					ds.DrawImage(_spotDiffuseArithmetic);

				}
			}

			return imageSource;
		}


-----

其他单一特效就简单得很,掠过.想看效果的可以下载一下 这个app前往商店下载:链接  ,这里文末有限时免费代码,(限时免费结束还是可以免费试用),或者上面提到的微软官方示例windows composition samples.


songshizhao
最初发表2019/12/30 2:14:40 最近更新2019/12/30 2:22:39 47
为此篇作品打分
10
   评论