首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Skia或Direct2D如何用GPU渲染线条或多边形?

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

Stack Overflow用户
提问于 2021-09-25 20:10:33
回答 1查看 316关注 0票数 3

这是一个了解GPU加速绘制二维矢量图形的原理的问题。

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

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

对于CPU呈现,我可以或多或少地想象如何呈现圆角矩形。我已经看到了很多不同的线条绘制算法。

但是对于GPU,我没有太多的线索。

  • Are圆角矩形由triangles?
  • Are圆角矩形组成,完全由野生像素shaders?

绘制

有没有一些基本的例子,可以告诉我这些事情是如何运作的基本原则?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-10 09:51:41

对于direct2d,没有源代码,但是由于它在幕后使用了d3d10/11,所以很容易看到它在Renderdoc幕后所做的事情。

基本上,d2d倾向于通过尝试将任何几何类型放入单个缓冲区来最小化绘制调用,而skia则有一些特定的着色器集(取决于形状类型)。

因此,例如,如果您绘制一个bezier路径,Skia将尝试在可能的情况下使用tesselation着色器(如果您之前呈现的元素是一个矩形,则需要一个新的绘制调用),因为您更改了管道状态。

另一方面,D2D倾向于在cpu上使用tesselate,然后推到一些顶点缓冲区,并且开关只有在更改画笔类型时才会绘制调用(如果从一个实色刷更改到另一个实色刷,它可以保持相同的着色器,因此它不会切换),或者当缓冲区已满时,或者如果您从一个形状切换到另一个文本(因为它随后需要发送纹理图解)。

请注意,当选择贝塞尔路径时,D2D在使所产生的几何图形非自交方面做了非常出色的工作(因此alpha混合可以正常工作,甚至在一些复杂的自交路径上也是如此)。

在圆角矩形上,它也是这样做的,只是将三角形缠绕在一起。

这允许它在很大程度上最小化绘图调用,并允许在非msaa曲面上使用反别名(这是在网格级别上完成的,带有一些带有alpha的小三角形)。它的缺点是它不使用太多的硬件特性,并且发出的几何图形很高,即使对于看似简单的形状也是如此)。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69329652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档