用C++逐像素绘制

3

几年前,我曾使用汇编语言为MS-DOS编写程序。其中一个可用的功能是告诉BIOS一个x坐标、一个y坐标和一种颜色(表示为整数),然后调用函数,BIOS会立即执行。

当然,这非常困难且耗时,但折衷方案是您可以在所需时间内得到完全符合要求的结果。

我尝试了多年来编写MacOS API,但发现它很难或不可能,因为根本没有文档。(NSNumber是什么鬼?为什么所有控件都返回无用的对象?)

我目前并没有具体的项目想法,但我希望能够编写C++代码,以类似的方式绘制像素。也许我有点疯狂,但我想要那种控制。

在我克服这个问题之前,我的限制是编写在控制台中运行的程序,通过打印文本并在屏幕满时滚动来实现。


现在,你可能需要使用OpenGL或其他API,因为现代操作系统通常不会让你直接写入GPU(除非你编写一个设备驱动程序,但最好留给GPU制造商)。 - drescherjm
我的建议是学习一个GUI框架,比如Qt或者类似的sfml - drescherjm
2个回答

5
您可以尝试使用Windows GDI(图形设备接口)来进行操作:点击这里了解更多信息。
#include <windows.h>

int main()
{
    HDC hdc = GetDC(GetConsoleWindow());
    for (int x = 0; x < 256; ++x)
        for (int y = 0; y < 256; ++y)
            SetPixel(hdc, x, y, RGB(127, x, y));
}

如果您想要绘制某些内容,那么这是非常容易的(如果这就是您的问题),正如您可以从上面的示例中看到的那样。


2
现代x86操作系统不再在实模式下工作。
您有几个选项:
  1. 运行虚拟机并安装实模式操作系统(例如MS-DOS)。

  2. 使用模拟实模式的层(例如DOSBox)。

  3. 使用GUI库(例如Qt、GTK、wxWidgets、Win32、X11)并使用画布或类似控件进行绘制。

  4. 使用2D API(例如SDL、SFML、Allegro的2D组件)。

  5. 使用3D API(例如OpenGL、Direct3D、Vulkan、Metal;如果需要可通过SDL、SFML或Allegro进行移植)以流式传输纹理,每帧用CPU逐像素填充。

  6. 编写片段着色器(可以使用3D API或在Web应用程序中使用WebGL更容易)。

如果您想学习现代图形处理方式,您应该选择最后两个选项。
请注意,如果您喜欢逐像素绘图,那么您可能会喜欢直接在GPU上编写片段着色器以及使用它们实现的所有惊人效果。 请参见ShaderToy以获取一些示例!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接