这是一个理解GPU加速2d矢量图形渲染原理的问题。
使用Skia或Direct2D,您可以绘制例如圆角矩形,贝塞尔曲线,多边形,也有一些效果,如模糊。
Skia/Direct2D提供基于CPU和GPU的渲染。
对于CPU渲染,我可以想象或多或少如何渲染圆角矩形。我已经看过很多不同的线条渲染算法了。
但是对于GPU我不太清楚。- 圆角矩形是由三角形组成的吗?
- 圆角矩形完全由野生像素着色器绘制吗?
是否有一些基本的例子可以向我展示这些东西是如何工作的基本原理?
(可能,解决方案也可以在Skia的源代码中找到,但我担心它会如此复杂/通用,像我这样的新手将无法理解任何东西。)
在direct2d的情况下,没有源代码,但由于它在底层使用d3d10/11,因此很容易看到它在Renderdoc的幕后做了什么。
基本上d2d倾向于通过尝试将任何几何类型适合于单个缓冲区来最小化绘制调用的策略,而skia则根据形状类型有一些专用着色器集。
因此,例如,如果你绘制一个bezier路径,Skia将尝试使用镶嵌着色器,如果可能的话(这将需要一个新的绘制调用,如果你之前渲染的元素是一个矩形),因为你改变管道状态。
D2D,在另一方面,倾向于在cpu上进行网格化,并推到一些顶点缓冲区,并切换绘制调用只有当你改变刷类型(如果你从一个纯色刷到另一个,它可以保持相同的着色器,所以它不会切换),或者当缓冲区满了,或者如果你从形状切换到文本(因为它需要发送纹理图集)。
请注意,当镶嵌贝塞尔路径D2D做一个非常伟大的工作,使结果几何非自相交(所以alpha混合工作正常,即使在一些复杂的自相交路径)。
对于圆角矩形,它做同样的事情,只是镶嵌成三角形。
这允许它在很大程度上最小化绘制调用,以及允许在非msaa表面上进行反混叠(这是在网格级别上完成的,带有alpha的一些小三角形)。它的缺点是它没有使用太多的硬件功能,并且即使对于看似简单的形状,发出的几何图形也可能相当高)。
由于d2d更喜欢使用三角形条或三角形列表,所以在绘制简单的三角形列表时,它可以做一些非常有趣的事情。
对于文本,d2d使用实例并为每个字符绘制一个实例,它也擅长批处理这些,所以如果你连续调用一些绘制文本函数几次,它也会尝试将其合并为单个调用。