使用 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 作为特效的输入源的步骤是

  1. 先创建 ID2D1CommandList 对象,在 ID2D1CommandList 进行界面的绘制
  2. 创建特效
  3. 将 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 作为特效输入源,最后将特效绘制在界面上

本文的代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 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 作为特效的输入源的更多相关文章

  1. 分享一组很赞的 jQuery 特效【附源码下载】

    作为最优秀的 JavaScript 库之一,jQuery 不仅使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果.这篇文章挑选了8个优秀的 jQuery 实例教程,这些  ...

  2. 【Android初级】使用Gallery实现照片拖动的特效(附源码)

    今天要分享一个非常简单的功能: 使用Android原生控件Gallery实现照片拖动的特效 实现思路如下: 在布局文件中定义一个Gallery控件 由于要显示多张图,为了方便,我直接引用了Androi ...

  3. 【Android初级】如何实现一个比相册更高大上的左右滑动特效(附源码)

    在Android里面,想要实现一个类似相册的左右滑动效果,我们除了可以用Gallery.HorizontalScrollView.ViewPager等控件,还可以用一个叫做 ViewFlipper 的 ...

  4. dotnet core开发体验之开始MVC

    开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...

  5. dotnet core调试docker下生成的dump文件

    最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...

  6. 7款让人惊叹的HTML5粒子动画特效(转载)

    1.HTML5 Canvas粒子模拟效果 这是一款利用HTML5 Canvas模拟出来的30000个粒子动画,当你用鼠标在canvas画布上移动时,鼠标周围的一些粒子就会跟着你移动,并形成一定的图案, ...

  7. Android——界面特效 相关知识总结贴

    帮助android UI实现动画特效 http://www.apkbus.com/android-79595-1-1.html 帮助android应用程序实现动画特效 http://www.apkbu ...

  8. 7款让人惊叹的HTML5粒子动画特效

    HTML5的很大一个优势就是可以更加便捷高效地制作网页粒子动画特效,特别是Canvas特性,可以实现在网页上绘制任何图形和动画.本文要分享7款让人惊叹的HTML5粒子动画特效,这些粒子特效都提供源代码 ...

  9. 惊艳的HTML5动画特效及源码

    今天我们要来分享一些很酷的HTML5动画演示,HTML5的强大之处在于它可以利用canvas的特性来绘制很多普通网页无法完成的图形和动画,canvas就像一块超级画板,在上面不仅可以实现平面图形,而且 ...

  10. 精选 5 个漂亮的 CSS3 图片滑过特效

    这篇文章将为大家分享5款漂亮的CSS3图片滑过特效,比如滑过后显示图片的详细文字介绍,又比如滑过后对图片进行淡入淡出的效果等等.让我们一起来看看,喜欢的朋友赶紧收藏. 1.非常酷的CSS3图片说明效果 ...

随机推荐

  1. C# 12 拦截器 Interceptors

    拦截器Interceptors是一种可以在编译时以声明方式替换原有应用的方法. 这种替换是通过让Interceptors声明它拦截的调用的源位置来实现的. 您可以使用拦截器作为源生成器的一部分进行修改 ...

  2. Smtp Oauth With Python

    我的博客园:https://www.cnblogs.com/CQman/ GitHub #基于Python语言的smtp Oauth 连接世纪互联运营的Office 365(或21V O365)的邮箱 ...

  3. 新零售SaaS架构:线上商城系统架构设计

    零售商家为什么要建设线上商城? 传统的实体门店服务范围有限,只能吸引周边500米以内的消费者.因此,如何拓展服务范围,吸引更多的消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳, ...

  4. .NET Emit 入门教程:第四部分:构建类型(Type)

    前言: 在动态生成代码的过程中,构建类型(Type)是至关重要的一步. 通过使用 Emit 中的 TypeBuilder,我们可以定义和创建各种类型,包括类.结构体和接口. 本节将深入探讨如何使用 T ...

  5. 使用vott对车牌位置进行标注

    1.软件安装 vott 下载地址 https://github.com/microsoft/VoTT/releases 双击vott-2.2.0-win32.exe安装标注软件,安装成功后桌面会生成应 ...

  6. multisim中常见的显示器

    multisim中常见的显示器 1.实验原理 multisim中做实验仿真一般需要各种各样的仿真器来模拟实验结果.这里列举几种比较常见的显示器以便后面快速选择. 2.实验操作 (1)LED[二极管] ...

  7. GraphPro

    GraphPro: Graph Pre-training and Prompt Learning for Recommendation 北京B区 / 032机 北京B区 / 224机 数据集介绍 本文 ...

  8. JWT登录认证-项目BotBattle

    目录 session 授权认证原理 密码存储与加密 jwt(JSON Web Token)验证 JWT 的无状态认证机制 实践与调试 实现目标:在没有判断登录认证的情况下,访问任意界面,直接跳转到登录 ...

  9. 10 CSS边框属性

    10 CSS边框属性 border-style(边框风格) 定义边框的风格,值可以有: /* none:没有边框,当border的值为none的时候,系统将会忽略[border-color] hidd ...

  10. 3 CSS组合选择器

    3 组合选择器 页面元素比较复杂,存在多个嵌套.为了更加灵活选择页面中的元素,CSS中还提供了组合选择器.组合选择器就是将多个基本选择器通过一定的规则连接起来组成一个复杂选择器. 后代子代选择器 &l ...