如果我们想做一个类似于MS Paint的应用程序,我们是否应该使用OpenGL来渲染图形呢?我想提到使用传统的GDI与使用OpenGL相比性能问题。如果存在更好的库可用于此目的,请向我展示一下。
GDI、X11、OpenGL等都是渲染API,通常不用于图像处理(虽然可以这样做,但需要一些预防措施)。
在像 MS Paint 这样的绘图应用程序中,如果它是基于像素的,则通常会使用一些常规代码或特殊图像处理库来操作某个图片缓冲区,然后将完整的缓冲区发送到渲染API。
如果您的数据模型由笔画和单个形状(即矢量图形)组成,则 OpenGL 是一个相当好的后端。然而,可能值得研究一些其他用于矢量图形的API,例如 OpenVG(在其当前实现中,它依赖于 OpenGL,但原生实现直接在GPU上运行可能会更好)。
在您的使用场景中,当前计算机不会遇到任何性能问题,因此不要从那些标准选择您的API。与 GDI 相比,OpenGL 在纹理映射、Alpha混合等方面肯定更快。但是,根据系统和GPU,对于诸如绘制弧线或填充具有复杂绕组规则的复杂自相交多边形等简单事物,纯GDI可能会优于OpenGL。
在这种情况下,没有不使用OpenGL的好理由。除非你对GDI有多年的经验,但对OpenGL一无所知。
另一方面,在许多情况下,OpenGL可能会更加优越。在GLSL着色器中组合图层或调整色相/饱和度/亮度/对比度将快几个数量级(实际上几乎是“瞬间”),如果计算机上有一个相对较新的显卡。用“模糊”笔触画一条自由路径(即反复混合具有alpha透明度的精灵)将快得多。在具有相当合理的尺寸的图像上,大多数过滤器内核应该接近实时运行。双线性过滤的重新缩放在硬件中运行。
在512x512图像上,这些事情并不重要,因为在这种分辨率下几乎所有东西都是瞬间发生的,但在数字相机拍摄的典型4096x3072(或更大)图像上,这可能会非常明显,特别是如果您有4-6个图层。