有时,我使用矢量图形,只是因为在某些情况下它们看起来稍微好一点,而在其他情况下,我则使用位图/栅格图形。
我想知道,这两个选项之间是否存在明显的性能差异?
有时,我使用矢量图形,只是因为在某些情况下它们看起来稍微好一点,而在其他情况下,我则使用位图/栅格图形。
我想知道,这两个选项之间是否存在明显的性能差异?
Answers:
正如TheBuzzSaw所说,它确实取决于很多事情,包括光栅化图形与矢量图形的实现。
以下是一些使用传统栅格化方法呈现的高性能矢量图形方法。
Loop和Blinn显示了如何通过渲染单个三角形并使用像素着色器中的纹理坐标来表示像素在曲线上方还是下方,来绘制矢量贝塞尔曲线的二次方: http://www.msr-waypoint。网络/zh-cn/um/people/cloop/LoopBlinn05.pdf
基本思路是将三角形角位置设置为3个控制点位置,并将每个角处的纹理坐标分别设置为(0,0),(0.5,0)和(1,1)。在着色器中,如果插值的纹理坐标(x * xy)<0,则像素在曲线下方,否则在曲线上方。
您可以在shadertoy上看到它的伪实现:https ://www.shadertoy.com/view/4tj3Dy
至于第二种方法,这是Valve公司的一种方法,其中到形状的距离存储在纹理中,而不是像素数据中,从而允许使用纹理采样绘制矢量图形。解码非常简单,即使在仅使用alpha测试的固定功能硬件上也可以实现! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf
为了让您了解第二种技术的效果,此1024x768胡子图像是由具有单个颜色通道的64x32源图像生成的!(aka 2KB,未压缩)
我还在自己的博客上写了一些有关它的东西:http : //blog.demofox.org/2014/06/30/distance-field-textures/
以下是一些示例OpenCL代码,以显示其简单程度:
float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);
这两种技术都非常快,并且使矢量和光栅化图形之间的界线有些模糊。它们使用栅格化技术进行渲染,但具有缩放/缩放属性,如矢量图形技术。
可能有。
较少的技术答案:
如果您正在建立与图形编程无关的网站或其他应用程序,那么答案可能是肯定的。底层API将尝试猜测如何呈现它们并有效地对其进行缓存。但是,当您的应用程序运行并且API有时会错误地猜测时,它可能不得不重新渲染事物并影响性能。
更多技术:
请记住,除非您使用最新的GPU之一和用于在GPU上绘制矢量路径的库,否则所有位图纹理都将由GPU渲染。
我将考虑将矢量图形渲染为纹理的典型情况。在这里,性能将取决于您的工具链,您的应用程序是否根据矢量资产动态创建纹理以及是否以各种缩放级别查看图形。涉及两个问题:资源和纹理生成。如果您仅以静态大小显示图形,那么我会说没有区别,也许您的工具链可以在运行时将资源转换为位图图形。但是,如果它们以各种大小显示或在3D世界中显示,则将需要mip映射纹理,这会占用更多内存。如果您真的想看到具有更大纹理的保真度“接近”,它们将占用大量内存。
我希望这有帮助。
有几种渲染矢量图形的方法。正如TheBuzzSaw提到的那样,NVIDIA拥有一个扩展,可以相当快地渲染一般路径(但当然,它仅适用于NVIDIA GPU)。艾伦·沃尔夫(Alan Wolfe)提到了隐式曲面方法(Loop-Blinn / distance字段),该方法定义了一个函数,该函数说明您是在形状的内部还是外部,并根据该函数为像素着色。另一种方法是“模版覆盖”,您可以将路径渲染到模版缓冲区中,并使用偶数计数确定路径是否覆盖像素。
但是,总的来说,要权衡的是渲染栅格将更快,但更容易混叠(即使距离场在低和高比例下也会分解)。渲染路径需要大量设置,但理论上可以缩放到任何分辨率。