只是一个关于常见商业编辑软件(如Photoshop或Sony Vegas)结构的快速问题:
虽然我知道这些应用程序的UI是如何实现的,但我不清楚其他更高级的图形是如何开发的?
我很了解OpenGL和DirectX等用于2D和3D渲染的库。我也知道使用软件渲染(集成图形)可以做很多事情。但是这些程序使用哪个选项呢?
我知道Photoshop有GPU加速渲染的选项。这意味着他们必须编写两次渲染代码,一次用于软件渲染,另一次用于GPU渲染。这甚至没有考虑到这样一个事实,即在Windows机器上使用DirectX通常更好,而OpenGL与其他操作系统兼容。
这些应用程序的开发人员真的会花时间为所有这些可能性重新编写图形代码吗,或者是否使用了一些库/更容易的转换?
谢谢!
我不知道Photoshop和Vegas是怎么做到的;但在我工作的地方,我们已经开发了几个独立于操作系统的成像应用程序。有一些框架声称是独立于系统的,可以帮助绘制图形,Qt和Firemonkey是我使用过的两个。但这是一个很大的麻烦,因为你仍然需要在任何地方都包含代码或编译器指令来区分你运行的操作系统。每个图形应用程序只有几个通用的绘图原语。
对于二维应用程序,如果可以绘制直线,则也可以使用自己的库绘制曲线。如果可以填充多边形,则也可以填充曲线。此外,如果可以绘制直线和填充多边形,那么也可以在三维中绘制。由于有这么小的一组主元素,您可以创建自己的图形上下文对象(OOP)来执行所有这些功能。该图形上下文可以(如您所说)在使用DirectX、GDI、OpenGL、Metal、Vulkan或您自己的软件渲染器之间切换。
对于每个操作系统,你必须弄清楚如何获得窗口对象的句柄及其缓冲区。如果适用,你还必须弄清楚怎样将缓冲区链接到你的显卡。
这种创建自己的图形上下文的方法唯一不太好的地方是涉及到某些图形卡功能,如AA或着色器的编程方式。由于额外的工作,我从未尝试过自己对这些功能进行编程。这就是为什么在Maya、3D Studio Max、Blender等3D程序中,如果视口未设置为软件渲染,则视口看起来总是更好。大多数图形程序员喜欢依赖他们的图形API。
所以总结:
如果你能以一种与操作系统无关的方式绘制线条、填充多边形并访问像素数据,那么你就可以自己完成80%的图形编程。这些函数可以封装到您自己的库中,该库可以在不同的系统上以不同的方式绘制这些主键。