如何在
c++
中快速绘制像素阵列?
我在stackoverflow上看过很多像这样的问题 他们都回答:
但必须有办法,opengl是如何做到的!
我正在写一个小的光线跟踪器,需要绘制每个像素
每秒多次。
opengl能够做到这一点,平台无关和 快速 ,
那么我怎样才能实现没有opengl ?
“没有opengl” dos 不意味着
请仅建议平台原生方法
或者最接近的图书馆。
如果可能(我知道的话)
如何我可以这样做吗?
平台无关的解决方案首选。
答案 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所说,至少还有其他两种绘制像素的方法:
这两者都是内核的一部分,因此它们比X11更低级,而X11不是内核的一部分。两者都可以绘制任意像素(例如penguins)。我猜这两个都是平台无关的(比如OpenGL)。
有关如何在Linux上绘制内容的更多信息,请参阅this。