Skia 或 Direct2D 如何使用 GPU 渲染线条或多边形?

2023-12-27

这是一道了解2d矢量图形GPU加速渲染原理的题。

使用 Skia 或 Direct2D,您可以绘制例如圆角矩形、贝塞尔曲线、多边形,还有模糊等效果。

Skia / Direct2D 提供基于 CPU 和 GPU 的渲染。

For the CPU渲染,我或多或少可以想象如何例如渲染出一个圆角矩形。我已经见过很多不同的线条渲染算法。

But for GPU,我没有太多线索。

  • 圆角矩形是由三角形组成的吗?
  • 圆角矩形是否完全由野生像素着色器绘制?

是否有一些基本示例可以向我展示此类事物如何工作的基本原理?

(也许,解决方案也可以在 Skia 的源代码中找到,但我担心它会如此复杂/通用,以至于像我这样的菜鸟什么都看不懂。)


对于 direct2d,没有源代码,但由于它在底层使用 d3d10/11,因此很容易通过 Renderdoc 查看它在幕后的作用。

基本上,d2d 倾向于制定一个策略,通过尝试将任何几何类型放入单个缓冲区中来最大程度地减少绘制调用,而skia 则根据形状类型拥有一些专用着色器集。

例如,如果您绘制贝塞尔曲线路径,Skia 将在可能的情况下尝试使用曲面细分着色器(如果您渲染的前一个元素是矩形,则需要新的绘制调用),因为您更改了管道状态。

另一方面,D2D 倾向于在 cpu 上进行细分,并推送到某些顶点缓冲区,并且仅在更改画笔类型时才切换绘制调用(如果从一种纯色画笔更改为另一种,它可以保留相同的着色器,因此它不切换),或者当缓冲区已满时,或者从形状切换到文本(因为它需要发送纹理图集)。

请注意,当细分贝塞尔路径时,D2D 在使生成的几何图形非自相交方面做了非常出色的工作(因此即使在某些复杂的自相交路径上,alpha 混合也能正常工作)。

在圆角矩形的情况下,它会执行相同的操作,只是细分为三角形。

这使得它可以在很大程度上最大限度地减少绘制调用,并允许在非 msaa 表面上进行抗锯齿(这是在网格级别完成的,有一些带有 alpha 的小三角形)。它的缺点是它没有使用太多的硬件功能,并且发出的几何图形可能相当高,即使对于看似简单的形状也是如此。

由于 d2d 更喜欢使用三角形条或三角形列表,因此在绘制简单的三角形列表时,它可以做一些非常有趣的事情。

对于文本,d2d 使用实例化并为每个字符绘制一个实例化的四边形,它也擅长对这些进行批处理,因此如果您连续多次调用某些绘制文本函数,它也会尝试将其合并到单个调用中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Skia 或 Direct2D 如何使用 GPU 渲染线条或多边形? 的相关文章

  • 通过 RDP 使用 WPF 的 Direct2d

    我正在开发一个 C 应用程序 它使用 SharpDx 通过 Direct2d 渲染地图 该地图与 D3DImage 一起显示在 WPF 主机上 在本地计算机上 一切正常 但当我尝试通过远程桌面连接时 D3DImage 会丢失其后备缓冲区 并
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 帮我用光线追踪器解决这个错误

    我不会针对这个问题发布任何代码 因为它需要太多的上下文 但我将从概念上解释我正在做什么 我正在构建一个使用仿射变换的简单光线追踪器 我的意思是 我将来自相机坐标的所有光线与通用形状相交 这些形状都具有关联的仿射变换 并且光线在与场景对象相交
  • 使用 tfprof 分析 TensorFlow

    我正在尝试分析 TensorFlow 的计算 内存使用情况 发现tfprof https github com tensorflow tensorflow tree master tensorflow tools tfprof是实现我的目的
  • 避免 XferMode 替换画布上的颜色

    我正在尝试替换使用在画布上绘制的内容的颜色避免Xfer模式 http developer android com reference android graphics AvoidXfermode html 从 android 文档来看 它看
  • 使用 getRGB() 时负数的含义是什么?

    我对颜色 渲染等很陌生 并且观看了一些有关渲染等的教程视频 我的问题是 当我致电getRGB像素上的方法 它返回一个负整数 这个负数是什么意思 例如 当我打电话时getRGB对于 r 186 g 186 b 186 的颜色 它返回 4539
  • 图像在 3D 空间中绕 Y 轴旋转

    我有一个 BufferedImage 我想用 theta 角而不是仿射变换绕 Java 中的 Y 轴旋转图像 图片 旋转将如下图所示 矩形将是图像 我可以通过旋转图像的每个像素并绘制图像来做到这一点 因为我必须旋转很多图像 所以我认为这不是
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • 我们如何在每次运行时使用不同的种子在 CUDA C 中生成随机数?

    我正在研究一个随机过程 我想在每次运行程序时在 CUDA 内核中生成不同的系列随机数 这类似于我们在 C 中声明 种子 时间 空 接下来是 srand 种子 和兰特 我可以通过内核将种子从主机传递到设备 但是 这样做的问题是我必须将整个种子
  • 带伽玛参数的渐变色阶?

    我有一些对比度非常微弱且有相当多噪声的成像数据 当我用线性色阶显示它时 它显示得不好 在 imageJ 或 Photoshop 等成像软件中 有一条色调曲线 人们可以调整该曲线以非线性方式提高对比度 并有效地拉伸某些感兴趣区域的比例以查看更
  • 在列标题上绘制矩形

    I m painting rectangle on the column headers in datagridview but on scrolling to right it disappears as in the picture s
  • x11/xlib 与 Microsoft Visual C++

    我从维基百科复制粘贴这段代码 http en wikipedia org wiki Xlib http en wikipedia org wiki Xlib 我收到此错误 fatal error C1083 Cannot open incl
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • Android Paint:如何获得“喷枪”效果?

    我正在关注 API 演示中的 FingerPaint 演示 我需要获得 喷枪 效果 从某种意义上说 当我在同一个点上绘制时 它会变得越来越暗 请看图片 正如你所看到的 中心更暗 因为我不止一次在同一个地方涂上油漆 请问 如果绘制多次 如何获
  • c# GDI边缘空白检测算法

    我正在寻找解决方案检测边缘空白c 位图 来自 c 托管 GDI 库 图像将是透明的 or white 大多数 400x 图片的尺寸为 8000x8000px 边缘周围有大约 2000px 的空白 找出边缘的最有效方法是什么 x y 高度和宽
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • nvidia GPU 上的内核真的有超时吗?

    寻找为什么我的内核产生奇怪的错误消息或仅 0 结果的答案我发现了这个answer https stackoverflow com questions 3988645 cl out of resources for 2 millions fl

随机推荐

  • 来自同一 hclust 对象的绘图之间的颜色变化需要保持统一以保证用户体验

    我正在尝试创建一个聚类评估工具 通过3情节 但颜色不一致 因此 一个簇中的一个簇可能在一个图中是蓝色的 但在另一个图中是黄色的 对用户不友好 可以为任何 Hclust 对象提供以下函数 它将生成 3 个图 树状图 聚类图和轮廓图 颜色与后两
  • 查找某个值是否在其他列的范围内

    我有一个数据框df看起来像这样 Input df lt read table text ID Q1 PM Q1 TP Q1 overall Q2 PM Q2 LS Q2 overall 1 1 2 3 1 2 2 2 0 NA NA 2 1
  • 查找N个列表中的共同对象

    我有 N 个 人物 列表 人有2个属性 Id and Name 我想找到所有 N 个列表中包含的人员 我只想匹配 Id 下面是我的出发点 List
  • C# 动态表名查询

    我想构建一个查询 其中表名是动态的 我将从另一个查询中获取它 这两个查询位于不同的数据上下文中 CODE var tablename from tab in db Tabs where tab id tabid select tab nam
  • 是否有从 Visual Studio 项目中编译 CIL 代码的示例

    我意识到有人询问并回答了 Visual Studio 不支持 CIL MSIL 项目 这MSBuildContrib http msbuildcontrib codeplex com项目有一个 ILASM 任务 允许您在构建时编译 IL 文
  • 如何隐藏Android平板电脑底部系统栏

    我正在开发一个仅适用于平板电脑的应用程序 其中要求是在平板电脑的全屏上运行该应用程序 为此 我在主要活动中使用了以下代码 getWindow requestFeature Window FEATURE NO TITLE getWindow
  • 按时间索引过滤 Pandas DataFrame

    我有一个从早上 6 36 到下午 5 31 的 pandas DataFrame 我想删除时间小于 8 00 00 AM 的所有观察结果 这是我的尝试 df df df index lt 2013 10 16 08 00 00 这没有任何作
  • 更改 ng-multiselect-dropdown 的 css

    我想更改 ng multiselect dropdown 中的 css
  • 为什么在迭代 NumPy 数组时 Cython 比 Numba 慢很多?

    当迭代 NumPy 数组时 Numba 似乎比 Cython 快得多 我可能缺少哪些 Cython 优化 这是一个简单的例子 纯Python代码 import numpy as np def f arr res np zeros len a
  • 使用 Nexus 设置缺少 Maven 依赖项

    我正在尝试构建一个 Maven 项目来测试一些测试软件 Arquillian 我设置了 nexus 并将 jboss 存储库添加到公共组的底部 当我跑步时mvn test我收到这个错误 Missing 1 com sun istack is
  • 同一tomcat的webapp之间共享对象

    我有 2 个 web 应用程序在两个上下文中运行 c1 c2 都紧接在根目录之后 我在 c1 中放置了一个startupListener 来共享一个变量 在 c2 中放置了另一个来检索它 我在 c1 中的启动侦听器是 public void
  • 将列类型更改为导轨中较长的字符串

    在第一次迁移时 我在列上声明content成为字符串 Activerecord 根据注释 gem 将其设置为 string 255 将应用程序推送到使用 postgres 的 Heroku 后 如果我在内容表单中输入长度超过 255 的字符
  • 如何在doc任务中排除java源文件?

    我正在将 sbt 0 11 2 用于混合 Java Scala 项目 我意识到当我运行时doc从 sbt 中运行命令 它不仅为 Scala 源文件创建 scaladocssrc main scala 也适用于 Java 源文件src mai
  • kafka 8 和内存 - 内存不足,Java 运行时环境无法继续

    我正在使用具有 512 兆内存的 DigiOcean 实例 在使用 kafka 时出现以下错误 我不是一个精通java的开发人员 如何调整kafka以利用少量的内存 这是一个开发服务器 我不想为更大的机器支付更多的每小时费用 There i
  • 具有嵌套模块的嵌套路由

    我第一次开发 Angular 2 应用程序 我有与此类似的路由 home projects projects id members projects id members id tasks 从我在互联网上可以找到的所有参考资料 教程和文章中
  • wordpress get_the_category 返回空

    保存新评论后 我可以通过functions php进行重定向 add filter comment post myredirect 我想重定向到产品类别列表 例如 http example org baktec27 product cat
  • C# 中拦截对属性 get 方法的调用

    假设我们有这个类 public class Person public int Id get set public string Name get set 现在 在 C 中是否可以拦截对属性获取方法的调用 运行其他方法并返回该方法的结果而不
  • 将字符串文字分配给 char 数组,如何将字符串文字复制到堆栈上?

    我知道当您执行 char array string 时 字符串文字 string 会从数据段复制到堆栈 字符串文字是否逐字符复制 或者编译器获取字符串文字的起始和结束地址并将整个字符串一次性复制到堆栈中 thanks 只要观察到的结果相同
  • Provider 与 InheritedWidget

    我错了还是我们只是想传递一个值Widget tree Provider https pub dev packages provider只是一个InheritedWidget with a dispose method 是的 Provider
  • Skia 或 Direct2D 如何使用 GPU 渲染线条或多边形?

    这是一道了解2d矢量图形GPU加速渲染原理的题 使用 Skia 或 Direct2D 您可以绘制例如圆角矩形 贝塞尔曲线 多边形 还有模糊等效果 Skia Direct2D 提供基于 CPU 和 GPU 的渲染 For the CPU渲染