这是一个了解GPU加速绘制二维矢量图形的原理的问题。
使用Skia或Direct2D,您可以绘制例如圆形矩形,贝塞尔曲线,多边形,也有一些效果,如模糊。
Skia / Direct2D提供基于CPU和GPU的渲染。
对于CPU呈现,我可以或多或少地想象如何呈现圆角矩形。我已经看到了很多不同的线条绘制算法。
但是对于GPU,我没有太多的线索。
绘制
有没有一些基本的例子,可以告诉我这些事情是如何运作的基本原则?
(也许,这个解决方案也可以在Skia的源代码中找到,但我担心它是如此复杂/通用,以至于像我这样的菜鸟什么都不懂。)
发布于 2021-11-10 09:51:41
对于direct2d,没有源代码,但是由于它在幕后使用了d3d10/11,所以很容易看到它在Renderdoc幕后所做的事情。
基本上,d2d倾向于通过尝试将任何几何类型放入单个缓冲区来最小化绘制调用,而skia则有一些特定的着色器集(取决于形状类型)。
因此,例如,如果您绘制一个bezier路径,Skia将尝试在可能的情况下使用tesselation着色器(如果您之前呈现的元素是一个矩形,则需要一个新的绘制调用),因为您更改了管道状态。
另一方面,D2D倾向于在cpu上使用tesselate,然后推到一些顶点缓冲区,并且开关只有在更改画笔类型时才会绘制调用(如果从一个实色刷更改到另一个实色刷,它可以保持相同的着色器,因此它不会切换),或者当缓冲区已满时,或者如果您从一个形状切换到另一个文本(因为它随后需要发送纹理图解)。
请注意,当选择贝塞尔路径时,D2D在使所产生的几何图形非自交方面做了非常出色的工作(因此alpha混合可以正常工作,甚至在一些复杂的自交路径上也是如此)。
在圆角矩形上,它也是这样做的,只是将三角形缠绕在一起。
这允许它在很大程度上最小化绘图调用,并允许在非msaa曲面上使用反别名(这是在网格级别上完成的,带有一些带有alpha的小三角形)。它的缺点是它不使用太多的硬件特性,并且发出的几何图形很高,即使对于看似简单的形状也是如此)。
由于d2d更喜欢使用三角形条或三角形列表,所以在绘制一个简单的三角形列表时,它可以做一些非常有趣的事情。
对于文本,d2d使用实例并按字符绘制一个实例四次,它还擅长于对这些字符进行批处理,因此如果您连续多次调用一些绘制文本函数,它也将尝试将其合并为一个调用。
https://stackoverflow.com/questions/69329652
复制相似问题