在C++中逐个像素地绘制

Drawing pixel by pixel in C++

本文关键字:像素 绘制 C++      更新时间:2023-10-16

几年前,我曾经用汇编语言为MS-DOS编程。 可用的一件事是告诉 BIOS 一个x坐标、一个y坐标和一个颜色(表示为整数(,然后调用一个函数,BIOS 会立即完成。

当然,这是一项非常艰苦的工作,非常耗时,但代价是你在你想要的时候得到了你想要的东西。

我尝试编写MacOS API多年,但发现这要么困难,要么不可能,因为根本没有记录任何内容。(NSNumber是什么鬼? 为什么所有的控件都返回一个无用的对象?

我现在真的没有任何具体的项目,但我希望能够编写能够以相同方式绘制像素的C++。也许我疯了,但我想要那种控制。

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

您可以尝试使用 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));
}

从上面的例子中可以看到,绘制一些东西(如果这是你要问的(非常容易。

现代 x86 操作系统在真实模式下不再工作。

您有以下几种选择:

  1. 运行虚拟机并安装实模式操作系统(例如 MS-DOS(。

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

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

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

  6. 使用
  7. 3D API(例如 OpenGL、Direct3D、Vulkan、Metal;如果您希望它可移植,可能由 SDL、SFML 或 Allegro 公开(来流式传输您每帧使用 CPU 逐像素填充的纹理。

  8. 编写片段着色器(使用 3D API 或更轻松地在 Web 应用程序中使用 WebGL(。

如果您想了解当今图形是如何完成的,您应该使用最后 2 个选项。

请注意,如果您喜欢"逐像素"绘制,您可能会喜欢直接在 GPU 上编写片段着色器以及您可以使用它们实现的所有惊人效果。参见ShaderToy的一些例子!