【问题标题】:Learning about low-level graphics programming学习底层图形编程
【发布时间】:2010-09-19 03:32:00
【问题描述】:

我对了解可用于制作图形应用程序的不同抽象层很感兴趣。

我看到很多术语:在最高抽象级别,我听说过 C#、.NET、pyglet 和 pygame 之类的东西。再往下,我听说了 DirectX 和 OpenGL。然后是 DirectDraw、SDL、Win32 API 以及 WxWidgets 等其他多平台库。

我如何才能很好地了解其中一层的结束位置以及下一层的开始位置?在 C 中在 Windows 中创建窗口的“最低级别”方法是什么? C++呢? (代码示例将是神圣的。)在 X11 中呢? OpenGL 和 DirectX 的 Windows 实现是否构建在 Win32 API 之上?我可以从哪里开始了解这些内容?

关于 SO 的另一个问题是建议 Programming Windows。对于 Linux 来说呢?有没有类似的书?

我知道这是非常低级的,并且有许多更友好的工具可用,但我至少想了解表面下发生的事情的基础知识。尽管我很想立即开始使用窗口和向量,但从 pygame 之类的东西开始对我来说太高级了;我真的需要制作完整的概念电路你如何在电脑上画画

我当然会感谢有关书籍和资源的建议,但我认为如果这个问题的答案充满了许多不同的方法来使用不同的图形编程方法来实现“Hello world”,那将是非常酷的。 C? C++?使用 OpenGL?使用 DirectX?在 Windows XP 上?在 Ubuntu 上?也许我要求太多了。

【问题讨论】:

标签: graphics


【解决方案1】:

Michael Abrash's Graphics Programming 'Black Book' 是一个很好的起点。另外,您可以免费下载!

【讨论】:

【解决方案2】:

马上,我会说“你要求太多了。”从我的经验来看,我建议阅读一些教程或买一本关于directX 或OpenGL 的书来开始。低于此值将非常复杂。我在 OGL 或 DX 中看到的大多数书籍都有很好的介绍,解释了函数/类的作用。

一旦你掌握了其中一个的窍门,你就可以随时深入图书馆,看看他们到底做了什么来降低。

或者,如果你真的,绝对必须学习最低级别...阅读上面帖子中的书。

【讨论】:

    【解决方案3】:

    如果你真的想从底部开始,那么画一条线是最基本的操作。计算机图形只是在网格(屏幕)上填充像素,因此您需要确定要填充哪些像素以获得从 (x0,y0) 到 (x1,y1) 的线。

    查看Bresenham's algorithm 了解其中的内容。

    【讨论】:

    • 如果一条线是通过在网格上填充像素来绘制的,那么如何绘制一条线比...设置一个像素更基本? :)
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      libX11 是 X11 的最低级别库。我相信 opengl/directx 直接与驱动程序/硬件对话(或模拟不受支持的操作),因此它们将是最低级别的库。

      如果您想从非常低级编程开始,请查找 VGA 的 x86 汇编代码并启动 dosbox 或类似的副本。

      【讨论】:

        【解决方案6】:

        要成为一名优秀的图形和图像处理程序员不需要这种低级知识,但我确实讨厌对我正在使用的内容一无所知。我看到有两种方法可以实现这一点 - 高层向下或底层向上。

        自上而下是跟踪操作如何从高级图形操作(例如画圆)到硬件的问题。深入了解 OpenGL。然后 Mesa 的源代码(免费!)提供了如何在软件中实现 OpenGL 的一瞥。接下来是 Xorg 的源代码,首先要查看操作如何从 API 调用通过客户端到达 X 服务器。最后,您将深入研究与硬件接口的设备驱动程序。

        自下而上:构建您自己的图形硬件。想想它可以连接到计算机的方式——如何通过几个字节大小的寄存器处理大量像素,DMA 将如何工作。编写一个设备驱动程序,并尝试设计一个可能对应用程序程序员有用的图形库。

        自下而上的方式是我多年前学习的方式,当时它可能使用慢速 8 位微处理器。电路和硬件-软件接口的直接经验让我很好地理解了困难的设计决策——例如。在设备驱动程序或更高级别中使用智能硬件绘制矩形。这些都没有实际的日常价值,但为理解新技术提供了知识基础。

        【讨论】:

        • 先生,我有一个问题想问这么久,不包含任何图形库的 c 是否具有可以使我像圆一样的功能,或者更基本的东西,操纵像素,代码多长无关紧要?
        【解决方案7】:

        在 MSWindows 上很容易:您可以使用 API 提供的内容,无论是标准的 windows 编程 API 还是 DirectX 系列 API 的:这就是您所使用的,并且有据可查。

        在 X windows 环境中,您可以使用所提供的任何 X11-libraries。如果你想了解 X 上开窗背后的原理,我建议你这样做,别管很多人告诉你不要这样做,它真的会帮助你理解 X 下的图形和开窗。你可以阅读关于 X 编程的文档(谷歌它)。 (在这个练习之后,你会喜欢更高级别的库!)

        除了上述之外,在绝对最低级别(不包括芯片级别),您可以调用切换到各种可用图形模式的中断 - 有几种 - 然后写入屏幕缓冲区,但是为此,您将不得不使用汇编程序,其他任何东西都会太慢。走这条路根本不便携。

        另一篇文章提到 Abrash 的黑皮书 - 一个极好的资源。

        编辑:至于关于 Linux 编程的书籍:这是一个社区的东西,周围有很多指南;还可以找到一个论坛,加入它,只要你文明行事,你就会得到你可能需要的所有帮助。

        【讨论】:

          【解决方案8】:

          最低级别是显卡的显存。计算机首次启动时,显卡通常设置为 80x25 字符传统模式。

          此时您可以使用 BIOS 提供的中断写入文本。您还可以从 16 种不同颜色的调色板中更改前景色和背景色。您可以使用访问端口/寄存器来更改显示模式。此时您可以说,将不同的字体加载到显存中并仍然使用 80x25 模式(操作系统安装通常会这样做),或者您可以继续启用 VGA/SVGA。这很复杂,这就是驱动程序的用途。

          一旦显卡处于“更高”模式,您可以通过访问映射到显卡的内存来更改屏幕上的内容。它是逐个像素水平存储的,其中一些“脏区”像素未在每行末尾映射到屏幕,您必须对其进行补偿。但是,是的,您可以将内存中图像的像素直接复制到屏幕上。

          对于 DirectX、OpenGL 等。不是直接写入屏幕,而是将命令发送到图形卡并自动更新其屏幕。像“嘿,你,画这个图像,我在这里,这里和这里加载到 VRAM”或“用这个变换矩阵画这些三角形......”这样的命令与逐个像素相比只需要一小部分时间。 CPU 会感谢你的。

          DirectX/OpenGL 是一个程序员友好的库,用于将这些命令发送到具有所有支持功能的卡,以帮助您顺利完成。更直接的方法只会徒劳无功。

          SDL 是一个抽象层,因此无需费心阅读它,我猜想它在每个系统上都有不同的工作方式。其中一个可能使用半直接屏幕书写,另一个 Direct3D 等。只要代码保持跨平台,不管是最快的..able。

          GDI/GDI+ 和 XWindow 系统。它们是专门为绘制窗口而设计的。最初他们使用逐像素方法进行绘制(这已经足够了,因为他们只需要在按下按钮或移动窗口等时重新绘制),但现在他们使用 Direct3D/OpenGL 进行加速绘图(以及特殊的影响)。优化取决于这些库的版本和实现。

          因此,如果您想要最大的功率和速度,DirectX/openGL 是您的最佳选择。 SDL 对于从跨平台环境中获得最大收益当然很有用,并且无论如何都与 OpenGL 集成。窗口系统排在最后,但不要低估它。尤其是微软最近推出的东西。

          【讨论】:

          【解决方案9】:

          Vulkan api 是一个 api,它让您可以非常低级别地访问 gpu 的大多数(如果不是全部)功能、计算和图形功能,它适用于 amd 和 Nvidia gpus(不是全部)

          您也可以使用 CUDA,但它仅适用于 Nvidia gpus,并且只能访问计算功能,没有视频输出。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-13
            • 2018-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多