dotnet C# 通过 Vortice 将 ID2D1CommandList 作为特效的输入源
使用 Direct2D 过程中将可以使用到 Direct2D 强大的特效功能,比如给某些界面绘制内容添加特效支持。本文将告诉大家如何通过 Vortice 将 ID2D1CommandList 作为特效的输入源,从而实现给某些绘制好的界面元素叠加特效
在上一篇 dotnet C# 通过 Vortice 使用 Direct2D 特效入门 博客里面告诉大家如何通过 Vortice 使用 Direct2D 特效的入门
在上一篇博客里面是通过将内容绘制在 IWICBitmap 里面,再进行叠加特效的。本文将告诉大家在不使用 IWICBitmap 而是采用 ID2D1CommandList 的方式作为特效的输入源
从 dotnet C# 通过 Vortice 使用 Direct2D 特效入门 博客可以知道,特效的输入源是 ID2D1Image 类型。在 Direct2D 里面有许多许多类型都继承于 ID2D1Image 类型,比如上一篇博客用到的 ID2D1Bitmap 类型和本篇的 ID2D1CommandList 类型
换句话说就是只需要将上一篇博客里用到的 IWICBitmap 替换为 ID2D1CommandList 类型即可进行特效的后续对接
在 dotnet 里面通过 Vortice 将 ID2D1CommandList 作为特效的输入源的步骤是
- 先创建 ID2D1CommandList 对象,在 ID2D1CommandList 进行界面的绘制
- 创建特效
- 将 ID2D1CommandList 作为特效的输入源
先来开始第一步,创建 ID2D1CommandList 对象,在 ID2D1CommandList 进行界面的绘制。详细关于如何在 Vortice 使用 ID2D1CommandList 请参阅 dotnet C# 通过 Vortice 使用 Direct2D 的 ID2D1CommandList 入门
private static ID2D1CommandList CreateCommandList(ID2D1DeviceContext renderTarget)
{
... // 忽略代码
}
以上的 CreateCommandList 类型将用来创建 ID2D1CommandList 对象,且在 ID2D1CommandList 进行界面的绘制。如以下的例子代码
private static ID2D1CommandList CreateCommandList(ID2D1DeviceContext renderTarget)
{
// 随意创建颜色
var color = new Color4((byte) Random.Shared.Next(255), (byte) Random.Shared.Next(255),
(byte) Random.Shared.Next(255));
ID2D1CommandList commandList = renderTarget.CreateCommandList();
var originTarget = renderTarget.Target;
renderTarget.Target = commandList;
using var brush = renderTarget.CreateSolidColorBrush(color);
for (int i = 0; i < 100; i++)
{
renderTarget.FillEllipse(new Ellipse(new System.Numerics.Vector2(Random.Shared.Next(Width), Random.Shared.Next(Height)), 10, 10), brush);
}
commandList.Close();
renderTarget.Target = originTarget;
return commandList;
}
为了让 CreateCommandList 能够工作起来,需要将其放入到 ID2D1RenderTarget 的 BeginDraw 和 EndDraw 中间调用,如以下代码
// 开始绘制逻辑
renderTarget.BeginDraw();
ID2D1CommandList commandList = CreateCommandList(renderTarget);
renderTarget.EndDraw();
获取到 ID2D1CommandList 类型的对象,即可进行第二步,按照 dotnet C# 通过 Vortice 使用 Direct2D 特效入门 提供的方法创建特效,如以下代码
var gaussianBlurEffect = d2dDeviceContext.CreateEffect(EffectGuids.GaussianBlur);
using ID2D1Effect d2dEffect = new ID2D1Effect(gaussianBlurEffect);
接下来设置 ID2D1CommandList 类型的对象为 ID2D1Effect 的输入源,如以下代码
ID2D1Image image = commandList;
d2dEffect.SetInput(0, image, new RawBool(true));
如此即可完成将 ID2D1CommandList 作为特效的输入源,接下来只需要设置一些特效的参数,将特效绘制在界面上即可,如以下代码
d2dEffect.SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, count / 60f * 3f);
renderTarget.DrawImage(d2dEffect, new Vector2(Random.Shared.Next(Width / 100), Random.Shared.Next(Height / 100)));
通过这个方法就可以给界面叠加上特效。核心方法就是将界面绘制在 ID2D1CommandList 上,再将 ID2D1CommandList 作为特效输入源,最后将特效绘制在界面上
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 0c5354bdda610102709ce3dc9b6dbeaa6d1b70b8
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 0c5354bdda610102709ce3dc9b6dbeaa6d1b70b8
获取代码之后,进入 VorticeD2DCommandListToEffect 文件夹
更多 DirectX 和 D2D 以及 Vortice 库的博客,请参阅我的 博客导航
另外,我创建了专门聊 Vortice 的 QQ 群: 622808968 欢迎加入交流技术
dotnet C# 通过 Vortice 将 ID2D1CommandList 作为特效的输入源的更多相关文章
- 分享一组很赞的 jQuery 特效【附源码下载】
作为最优秀的 JavaScript 库之一,jQuery 不仅使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果.这篇文章挑选了8个优秀的 jQuery 实例教程,这些 ...
- 【Android初级】使用Gallery实现照片拖动的特效(附源码)
今天要分享一个非常简单的功能: 使用Android原生控件Gallery实现照片拖动的特效 实现思路如下: 在布局文件中定义一个Gallery控件 由于要显示多张图,为了方便,我直接引用了Androi ...
- 【Android初级】如何实现一个比相册更高大上的左右滑动特效(附源码)
在Android里面,想要实现一个类似相册的左右滑动效果,我们除了可以用Gallery.HorizontalScrollView.ViewPager等控件,还可以用一个叫做 ViewFlipper 的 ...
- dotnet core开发体验之开始MVC
开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- 7款让人惊叹的HTML5粒子动画特效(转载)
1.HTML5 Canvas粒子模拟效果 这是一款利用HTML5 Canvas模拟出来的30000个粒子动画,当你用鼠标在canvas画布上移动时,鼠标周围的一些粒子就会跟着你移动,并形成一定的图案, ...
- Android——界面特效 相关知识总结贴
帮助android UI实现动画特效 http://www.apkbus.com/android-79595-1-1.html 帮助android应用程序实现动画特效 http://www.apkbu ...
- 7款让人惊叹的HTML5粒子动画特效
HTML5的很大一个优势就是可以更加便捷高效地制作网页粒子动画特效,特别是Canvas特性,可以实现在网页上绘制任何图形和动画.本文要分享7款让人惊叹的HTML5粒子动画特效,这些粒子特效都提供源代码 ...
- 惊艳的HTML5动画特效及源码
今天我们要来分享一些很酷的HTML5动画演示,HTML5的强大之处在于它可以利用canvas的特性来绘制很多普通网页无法完成的图形和动画,canvas就像一块超级画板,在上面不仅可以实现平面图形,而且 ...
- 精选 5 个漂亮的 CSS3 图片滑过特效
这篇文章将为大家分享5款漂亮的CSS3图片滑过特效,比如滑过后显示图片的详细文字介绍,又比如滑过后对图片进行淡入淡出的效果等等.让我们一起来看看,喜欢的朋友赶紧收藏. 1.非常酷的CSS3图片说明效果 ...
随机推荐
- 记录--如何在H5中实现OCR拍照识别身份证功能
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 业务背景 由于当前项目中需要实现身份证拍照识别的功能,如果是小程序可以使用微信提供的 ocr-navigator 插件实现,但是在企业微信 ...
- 记录--for in 和 for of的区别详解以及为for in的输出顺序
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { ...
- .NET Emit 入门教程:第三部分:构建模块(Module)
前言: 在这一部分中,我们将深入讨论动态程序集中模块的概念以及如何构建和管理模块. 1.模块的概念: 模块是动态程序集中的基本单位,它类似于一个独立的代码单元,可以包含类型.方法.字段等成员. 在动态 ...
- Scratch基础(一):安装和了解软件
Scratch基础(一):安装和了解软件 编写计算机程序代码的能力是当今社会读写能力的重要组成部分.当人们学习使用Scratch进行编码时,他们将学习解决问题,设计项目和交流思想的重要策略. 1.安装 ...
- CenterNet:Corner-Center三元关键点,检测性能全面提升 | ICCV 2019
为了解决CornerNet缺乏目标内部信息的问题,提出了CenterNet使用三元组进行目标检测,包含一个中心关键点和两个角点.从实验结果来看,CenterNet相对于CornerNet只增加了少量推 ...
- SkipList和java中ConcurrentSkipListMap的实现
目录 简介 SkipList ConcurrentSkipListMap SkipList的实现 concurrent的实现 总结 SkipList和java中ConcurrentSkipListMa ...
- OpenHarmony 3.2 Beta多媒体系列——音视频播放框架
一.简介 媒体子系统为开发者提供一套接口,方便开发者使用系统的媒体资源,主要包含音视频开发.相机开发.流媒体开发等模块.每个模块都提供给上层应用对应的接口,本文会对音视频开发中的音视频播放框架做一 ...
- Qt获取电脑有几个网卡,并获取对应的IPV4
标题:Qt获取电脑网卡对应的ip | Qt计算电脑有几个网卡 | Qt获取网卡ip信息 | Qt判断获取到的ip是否是IPV4 demo流程: 1.点击搜索网卡按钮,搜索电脑所有的网卡,将网卡名称 ...
- opengauss-jdbc问题整理
opengauss-jdbc问题整理(更新中) 问题 1 jdbc 批量执行 insert 语句时返回结果不符合 Spring jpa 预期 问题描述: jdbc 执行查询时,可以使用prepares ...
- 实例讲解昇腾 CANN YOLOV8 和 YOLOV9 适配
本文分享自华为云社区<昇腾 CANN YOLOV8 和 YOLOV9 适配>,作者:jackwangcumt. 1 概述 华为昇腾 CANN YOLOV8 推理示例 C++样例 , 是基于 ...