在C ++中逐像素绘制

时间:2018-07-02 17:45:23

标签: c++ graphics drawing pixels

几年前,我曾经使用汇编语言为MS-DOS编程。可以做的一件事情是告诉BIOS x坐标,y坐标和颜色(表示为整数),然后调用一个函数,BIOS会立即执行此操作。

当然,这是一项非常艰苦的工作,而且非常耗时,但是要权衡的是,您在想要的时候就得到了想要的东西。

我尝试写MacOS API多年,但发现困难或不可能,因为没有任何文献记载。 (NSNumber到底是什么?为什么所有控件都返回一个无用的对象?)

我现在实际上还没有任何特定的项目,但是我希望能够编写能够以相同方式绘制像素的C ++。也许我疯了,但是我想要那种控制。

直到我能克服这个问题,我仅限于编写在控制台中运行的程序,方法是打印文本并在屏幕变满时向上滚动。

2 个答案:

答案 0 :(得分:2)

现代的x86操作系统在real mode下无法正常工作。

您有几种选择:

  1. 运行VM并安装实模式操作系统(例如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或使用WebGL在Web应用程序中更容易)。

如果您想了解当今图形的真实制作方式,则应使用最后两个选项。

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

答案 1 :(得分:1)

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

从上面的示例中可以很容易地绘制出一些东西(如果这是您要的内容)。