我几年前在C和C ++中使用DirectDraw来绘制一些简单的2D图形。我习惯了创建表面,使用指针写入表面,翻转后缓冲区,在屏幕外表面存储精灵等等的步骤。所以今天如果我想用C或C ++编写一些2D图形程序,那么还有什么方法呢?
答案 0 :(得分:3)
Windows和Linux上有哪些库和工具?
SDL,OpenGL和Qt 4(它是gui库,但它对于2D渲染来说足够快/灵活)
这种相同的编程方法是否仍然适用,或者我必须对视频硬件抽象有不同的理解?
通常,您不会在每个帧中“使用指针”将数据写入表面,而是使用API提供的方法操作/绘制它们。这是因为与每帧从系统内存将数据传输到视频内存相比,驱动程序在视频内存中的运行速度更快。如果必须,您仍然可以将数据写入硬件表面/纹理(即使在每个帧中),但是可能需要以特殊方式处理这些表面以获得最佳性能。例如,在DirectX中,您需要告诉驱动程序表面数据将经常更改,并且您只需要将数据写入表面,而不是将其读回。此外,在面向3D的API(openGL / DirectX)中,另一个表面上的渲染表面有点“特殊情况”,您可能需要使用“渲染目标”(DirectX)或“帧缓冲对象”(OpenGL)。这与DirectDraw不同(AFAIK,你可以把任何东西搞砸到任何东西)。好处是,使用3D api,你可以获得非常灵活的处理表面/纹理的方法 - 拉伸,旋转,用颜色对它们进行着色,将它们混合在一起,使用着色器处理它们可以在硬件上完成。
另一件事是,具有硬件支持的现代3D api经常不能在8位托盘纹理上运行,并且更喜欢ARGB图像。可以在需要时模拟具有调色板的8位表面,并且2D低级api(SDL,DirectDraw)提供它们。您还可以使用片段/像素着色器在硬件上模拟8位纹理。
无论如何,如果你想要“老派”跨平台使用表面的方式(即“每帧使用指针写入数据” - 即你需要软件渲染器或其他东西),SDL很容易就可以实现。如果您想要更高级别,更灵活的操作 - Qt 4和OpenGL适合您。
答案 1 :(得分:2)
在Linux上你可以使用OpenGL,它不仅用于3D支持,还支持2D。
答案 2 :(得分:1)
SDL也很容易使用,开箱即用。它也是跨平台的,包括(并且有很多)插件可用于满足您的需求。它与openGL很好地连接,如果你需要3D支持。
答案 3 :(得分:0)
Windows 上的 Direct2D。
EGLOutput/EGLDevice 或 GEM,取决于 Linux 的 GPU 驱动程序。