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 渲染线条或多边形? 的相关文章

  • Graphics2D:在白色上绘制黑色?

    我确信这是一个非常愚蠢的问题 但我找不到答案 我对 Java2D API 没有经验 我正在尝试创建一个图像并将其写入 GIF 或 PNG 并且我希望它在白色背景上使用黑色笔 如果我不设置任何颜色 我会得到黑底白字 如果我使用 setPain
  • 有没有 Android Drawable 设计师?

    我想在我的 Android 应用程序中使用更多矢量图 提供图像并不像我希望的那样节省空间或可扩展 Android提供了一系列可绘制文件格式 http developer android com guide topics resources
  • 使 CUDA 内存不足

    我正在尝试训练网络 但我明白了 我将批量大小设置为 300 并收到此错误 但即使我将其减少到 100 我仍然收到此错误 更令人沮丧的是 在 1200 个图像上运行 10 epoch 大约需要 40 分钟 有什么建议吗 错了 我怎样才能加快这
  • 使用 AffineTransform 将形状缩放/转换为给定矩形

    我正在尝试缩放 翻译 java awt Shape with 仿射变换为了将其绘制在定义的边界矩形中 此外 我想在具有 的绘图区域中绘制它zoom 范围 我尝试了 AffineTransform 的各种串联 但找不到正确的序列 例如 以下解
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • Android 中的离屏绘图

    android 中是否可以像 Objective C 中的 imageContext 那样进行离屏绘图 如果有的话 请告诉我链接或某种提示 多谢 我相信您正在寻找Canvas http developer android com refer
  • C# 窗口形式的漂亮图形

    我需要使用 C 在 Windows 窗体中创建一些简单的图形 简单地说 我指的是线条 圆圈等 但是 当我画画时 例如实心圆 边缘不平滑 正如使用方形像素绘制圆时所预期的那样 但是当在矢量程序中使用相同数量的像素绘制相同的圆时 它看起来很完美
  • 如何正确实现TBitmap的扫描线访问?

    我正在尝试根据以下方式访问位图的扫描线关于内河码头的文章 http edn embarcadero com article 29173 使用像这样的扫描线 for y 0 to n do begin line bitmap scanline
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • AngularJS ng-重复重新渲染

    我正在使用 AngularJS 构建一个简单的应用程序 应用程序向服务器发出异步 AJAX 调用 服务器返回一个如下所示的数组 paragraphs content content one content cnt two content r
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • CUDA - 将 CPU 变量传输到 GPU __constant__ 变量

    与 CUDA 的任何事情一样 最基本的事情有时也是最难的 所以 我只想将变量从 CPU 复制到 GPUconstant变量 我很难过 这就是我所拥有的 constant int contadorlinhasx d int main int
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • 我点击的号码没有出现在反应项目的屏幕上

    当我尝试在屏幕中呈现点击的数字时 该数字没有出现 但它确实可以在控制台中显示 我不知道如何修复它应该在屏幕上 号码 旁边应用的号码 import render from testing library react import React
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu

随机推荐

  • 来自同一 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渲染