这是一道了解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(使用前将#替换为@)