在linux上快速高效地绘制pixelarray

时间:2013-07-07 09:10:40

标签: c++ linux opengl pixel

  

如何在c++中快速绘制像素阵列?

我在stackoverflow上看过很多像这样的问题 他们都回答:

  • 使用gdi(windows)
  • 使用opengl
  • ...

但必须有办法,opengl是如何做到的!


我正在写一个小的光线跟踪器,需要绘制每个像素 每秒多次
opengl能够做到这一点,平台无关 快速
那么我怎样才能实现没有opengl

“没有opengl” dos 意味着

  • 使用sdl(慢)
  • 使用此/该库

建议平台原生方法
或者最接近的图书馆。

如果可能(我知道的话)
如何我可以这样做吗? 平台无关的解决方案首选

2 个答案:

答案 0 :(得分:2)

在Linux上绘制图形,您必须使用X11或OpenGL。 (在不久的将来,Wayland可能是另一种选择)。在Linux中,没有“本地”的图形方式,因为Linux内核不关心图形API。它提供了一个接口(DRM),然后使用该接口在用户空间中实现图形系统。如果你只是想在屏幕上显示像素,而不关心窗口,那么你也可以mmap / dev / fbdev - 但你通常不希望这样,因为没有人希望他的屏幕被某些程序破坏,他无法移动或隐藏。

由于协议开销,无论使用哪种API,绘制单点都是低效的。

所以它是X11。因此,最好的办法是使用MIT-SHM扩展,用于更改缓冲区中的像素,然后由X11服务器整体进行blitting。当然,使用纯X11 Xlib函数执行此操作非常麻烦。所以这就是SDL为您提供的有效包装。

另一个选项是OpenGL。 OpenGL不是一个库!这是一个系统级API,几乎可以直接访问GPU。它与X11很好地集成。是的,API是通过正在加载的库提供的,但从技术上讲,库只是实际驱动程序的“包装器”或“接口”。使用OpenGL绘制单点毫无意义。但是您可以将几个点“批处理”到一个列表中(使用顶点数组),然后处理该列表。因此,我们的想法是在两个显示刷新间隔之间收集所有传入点,并在一个批次中绘制它们。

  

平台独立解决方案是首选。

为什么要询问 native API呢?根据定义,可能没有平台独立的本机API。无论你是本地人,还是平台独立。

在您的特定场景中,我认为SDL将是最佳解决方案,因为它为光线跟踪器提供了正确的抽象和程序端接口。仅供参考:像QEmu这样的虚拟机使用SDL。

或者您使用OpenGL,这是一个广泛支持的真正的平台中性API。

答案 1 :(得分:0)

  
    
      

在Linux上绘制图形,您必须使用X11或OpenGL。

    
  

这是绝对 false!反例:那些没有运行X11的平台,但它们显示像素(例如字体)。

旁注。 OpenGL通常依赖于在X11上(它的possible,虽然很难,但是在没有X11的情况下运行OpenGL)。

正如@datenwork所说,至少还有其他两种绘制像素的方法:

  1. 帧缓冲设备(fbdev),与图形硬件接口的抽象。很老,由Martin Schaller设计,见kernel docs。源代码是here。另请参阅here。这是simplest possible framebuffer driver
  2. 直接呈现管理器(DRM),一个内核子系统,为用户态应用程序提供API,以便将命令/数据直接发送到GPU。 (看起来很像OpenGL的功能,但是idk!)。源代码是here。这是一个初始化简单显示管道的DRM example
  3. 这两者都是内核的一部分,因此它们比X11更低级,而X11不是内核的一部分。两者都可以绘制任意像素(例如penguins)。我猜这两个都是平台无关的(比如OpenGL)。

    有关如何在Linux上绘制内容的更多信息,请参阅this