如果没有OpenGL,我如何绘制到显示?

如果没有OpenGL,我如何绘制到显示?,opengl,Opengl,我一直在学习OpenGL,当我坐在那里试图编写我的VBOs、PBOs、VAOs、纹理、四边形、绑定、片段着色器、顶点着色器,以及一整套其他现代抽象,这些抽象都是经过几十年的发展而成的,我想知道:显示的不是仅仅是一大块内存吗 我听说过这样的故事,在“好时光”(比如Commodore 64),你只需给内存中的任意字节赋值,屏幕就会改变一个像素。非常简单和优雅。在现代,随着层层抽象和保护措施的出现,这一点已经发生了变化,以至于改变显示器上的一个像素就在几百英尺之外 这就引出了一个问题:在现代,是否有可

我一直在学习OpenGL,当我坐在那里试图编写我的VBOs、PBOs、VAOs、纹理、四边形、绑定、片段着色器、顶点着色器,以及一整套其他现代抽象,这些抽象都是经过几十年的发展而成的,我想知道:显示的不是仅仅是一大块内存吗

我听说过这样的故事,在“好时光”(比如Commodore 64),你只需给内存中的任意字节赋值,屏幕就会改变一个像素。非常简单和优雅。在现代,随着层层抽象和保护措施的出现,这一点已经发生了变化,以至于改变显示器上的一个像素就在几百英尺之外

这就引出了一个问题:在现代,是否有可能仅仅“更新屏幕上的一个像素”?有没有可能编写我自己的图形驱动程序或其他东西,我可以发送命令到一些C包装器,它与GPU接口以更改这些像素?这是一个非常广泛的问题,但我很好奇。对于这个问题,我想要的答案是提供一个大概的轮廓,你必须做些什么,以便能够任意获得一些C代码来设置屏幕上的像素,以及一个大概的轮廓,为什么OpenGL已经取得了这样的进展-VBOs、PBOs、VAOs、绑定、着色器等解决了哪些问题,以及我们如何达到今天的水平

在现代,仅仅“更新屏幕上的一个像素”是可能的吗

对。例如,在Windows中,可以使用绘制像素或批量绘制。见Q/A

这很好,但这意味着您正在使用CPU进行渲染,您会发现GPU在这项任务中更有效,特别是当您需要合适的帧率和非平凡的图形时。之所以有这些“一整套其他现代抽象”,是为了作为GPU的接口,因为它有一组独立的内存和完全不同的执行模型。其他GPU库(OpenCL、DirectX、Vulkan等)都有相同的抽象


我已经掩饰了许多细微差别,但我希望这一点能被理解

显示器不是只有一大块内存吗

是的,它被称为帧缓冲区

我听说过一些故事,在“美好的时光”(比如海军准将64)

你现在的电脑开机时就是这样工作的!如果使用CPU写入视频内存,则称为软件渲染器

在现代,随着层层抽象和保护措施的出现,这一点已经发生了变化,以至于改变显示器上的一个像素就在几百英尺之外

不,它们不是“改变像素”的抽象/保护。现在软件渲染器不再使用了。相反,你必须告诉GPU(它本身就是另一台计算机)如何绘制。这种“谈话”是API(如OpenGL)为您所做的

现在,GPU意味着绘图速度快,这需要专门的代码和数据结构。这些就是您提到的所有东西:VBOs、PBOs、VAOs、着色器等(用OpenGL的说法)。这是没有办法的,因为GPU是不同的硬件

在现代,仅仅“更新屏幕上的一个像素”是可能的吗

是的,但最终会被GPU绘制出来,即使它看起来像一个内存写入

有没有可能编写我自己的图形驱动程序或其他东西,我可以发送命令到一些C包装器,它与GPU接口以更改这些像素

是的,但是“C包装器”是图形驱动程序。现代GPU的图形驱动程序非常复杂

为了能够任意获得一些C代码来设置屏幕上的像素,您需要做什么

您不能编写“C程序”来写入图形屏幕,因为C标准本身与图形显示无关

因此,这取决于您的操作系统、硬件、是否需要2D或3D加速支持、您选择的API

以及OpenGL取得进展的原因——VBOs、PBOs、VAOs、绑定、着色器等解决了哪些问题,以及我们如何达到今天的水平


请参见上文。

您可以创建自己的帧缓冲区-这只是一个整数数组-并对其进行光栅化,然后使用Windows GDI函数
SetBitmapBits()
将其一次性绘制到显示器上。最终的“绘制到显示”命令取决于操作系统

如何在帧缓冲区上进行光栅化完全取决于您。您可以使用CPU绘制单个像素或光栅化线和三角形,例如,请参阅我使用Windows GDI的旧CPU图形引擎的演示:。 只要不光栅化大型数据集,就可以使用CPU。根据我的经验,在CPU上实时60fps渲染的限制是每帧约50k行


如果你想光栅化非常大的数据集,你必须以某种方式使用GPU。由于帧缓冲区只是一个整数数组,因此您可以使用OpenCL或CUDA将其传输到GPU或从GPU传输到GPU,如果您的数据集恰好已在视频内存中,则可以并行快速执行所有光栅化。为此,您将需要一个额外的z缓冲区来决定哪些像素通过遮挡几何体进行过度绘制。通过这种方式,您可以以每秒60帧的速度栅格化大约3000万条线。此演示使用OpenCL在GPU上实时呈现:

这在很大程度上取决于您的硬件和操作系统。我认为在你的电脑上模拟X模式仍然是可能的(旧游戏仍然有效)