我很有兴趣了解可用于制作图形应用程序的不同抽象层。
我看到很多术语被抛出:在最高级别的抽象中,我听说过像C#,.NET,pyglet和pygame这样的东西。再往下,我听说DirectX和OpenGL。然后是DirectDraw,SDL,Win32 API,以及其他多平台库,如WxWidgets。
如何才能很好地了解其中一个图层的结束位置以及下一个图层的开始位置?什么是在Windows中创建窗口的“最低级别”方式?那么C ++呢? (代码示例将是神圣的。)在X11中怎么样? OpenGL和DirectX的Windows实现是否构建在Win32 API之上?我在哪里可以开始了解这些事情?
关于SO的另一个问题是建议Programming Windows。 Linux怎么样?有没有相当于这样的书?
我知道这是非常低级的,并且有许多更友好的工具可用,但我想至少学习表面下发生的事情的基础知识。我想尽可能地开始甩掉窗户和矢量,从像pygame这样的东西开始对我来说太高级了;我真的需要制作如何在计算机上绘制内容的完整概念电路。
我当然会欣赏有关书籍和资源的建议,但我认为如果这个问题的答案充满了许多不同的方式来通过不同的图形编程方法来获得“Hello world”,那将会非常酷。 C? C ++?使用OpenGL?使用DirectX?在Windows XP上?在Ubuntu上?也许我要求太多。
答案 0 :(得分:38)
最低级别是显卡的视频RAM。计算机首次启动时,通常将图形卡设置为80x25字符的传统模式。
此时您可以使用BIOS提供的中断来编写文本。您还可以从16种不同颜色的调色板中更改前景色和背景色。您可以使用访问端口/寄存器来更改显示模式。此时您可以说,将不同的字体加载到显示内存中并仍然使用80x25模式(操作系统安装通常会这样做),或者您可以继续启用VGA / SVGA。这很复杂,这就是司机的用途。
一旦卡片处于“更高”模式,您将通过访问映射到视频卡的内存来更改屏幕上的内容。它是逐像素地水平存储的,带有一些像素的“脏区”,这些像素没有映射到每行末尾的屏幕,你必须补偿它。但是,你可以将内存中图像的像素直接复制到屏幕上。
对于像DirectX,OpenGL这样的东西。而不是直接写入屏幕,命令被发送到图形卡,并自动更新其屏幕。像“嘿你,画这个图像我已经加载到这里,这里和这里的VRAM”或“用这个变换矩阵绘制这些三角形......”这样的命令与逐像素相比只需要一小部分时间。 CPU会感谢你。
DirectX / OpenGL是一个程序员友好的库,用于将这些命令发送到具有所有支持功能的卡,以帮助您顺利完成。更直接的方法只会是徒劳的。
SDL是一个抽象层,所以没有费心阅读它我猜它会有不同的方法在每个系统上工作。一方面,它可能会使用半直接屏幕写入,另一种是Direct3D等。只要代码保持跨平台,就可以用最快的速度。
GDI / GDI +和XWindow系统。它们专门用于绘制窗户。最初他们使用逐像素方法绘制(这很好,因为他们只需要在按下按钮或移动窗口时重绘等),但现在他们使用Direct3D / OpenGL来加速绘图(和特殊的效果)。优化取决于这些库的版本和实现。
因此,如果您想要最强大的功能和速度,DirectX / openGL就是您的选择。 SDL对于从跨平台环境中获得最大收益并且无论如何都可以与OpenGL集成非常有用。窗口系统是最后一个但不要低估它。特别是微软最近提出的东西。
答案 1 :(得分:22)
Michael Abrash's Graphics Programming 'Black Book'是一个很好的起点。另外,您可以免费下载!
答案 2 :(得分:5)
如果你真的想从底部开始,那么绘制一条线是最基本的操作。计算机图形只是填充网格(屏幕)上的像素,因此您需要确定要填充哪些像素以获得从(x0,y0)到(x1,y1)的线。
查看Bresenham's algorithm以了解所涉及的内容。
答案 3 :(得分:4)
要成为一名优秀的图形和图像处理程序员并不需要这种低水平的知识,但我不想对我正在使用的内容毫无头绪。我认为有两种方法可以追逐这种方式 - 高级向下或低级向上。
自上而下是跟踪动作从高级图形操作(如绘制圆形)到硬件的跟踪问题。快点了解OpenGL。然后,Mesa的源代码(免费!)提供了如何在软件中实现OpenGL的方法。接下来是Xorg的源代码,首先看看动作如何从API调用通过客户端传递到X服务器。最后,您将深入了解与硬件接口的设备驱动程序。
自下而上:构建自己的图形硬件。想一想它可以连接到计算机的方式 - 如何通过几个字节大小的寄存器处理大量像素,DMA如何工作。编写设备驱动程序,并尝试设计一个可能对应用程序员有用的图形库。
自下而上的方式就是我多年前学习的方式,当时它可能是缓慢的8位微处理器。电路和硬件 - 软件接口的直接经验让我很好地理解了困难的设计决策 - 例如使用聪明的硬件,设备驱动程序或更高级别绘制矩形。这些都不具备实际的日常价值,但为了解新技术提供了知识基础。
答案 4 :(得分:3)
请参阅开放GPU文档部分: http://developer.amd.com/documentation/guides/Pages/default.aspx
HTH
答案 5 :(得分:3)
在MSWindows上很容易:您使用API提供的内容,无论是标准的 Windows编程API 还是 DirectX系列API :这就是您使用的内容,他们有很好的文件记录。
在X windows环境中,您可以使用提供的 X11-libraries 。如果你想了解X窗口背后的原理,我建议你这样做,永远不要告诉你许多其他人,它真的会帮助你理解X下的图形和窗口。你可以阅读关于X编程的文档(google for it)。 (在本练习之后,您会欣赏更高级别的图书馆!)
除了上述之外,你可以去的绝对最低级别(不包括芯片级别)是调用可切换到各种图形模式的中断 - 有几种 - 然后写入屏幕缓冲区,但是为此你必须使用汇编程序,其他任何东西都会太慢。走这条路根本不可移植。
另一篇文章提及 Abrash的黑皮书 - 一个很好的资源。
编辑:关于编程Linux的书籍:它是一个社区的东西,有许多方法;还可以找到一个论坛,加入它,只要你行动文明,你就会得到所有你需要的帮助。
答案 6 :(得分:2)
马上,我会说“你问的太多了。”从我的经验来看,我建议阅读一些教程或者从directX或OpenGL上获得一本书。要比任何低,那将是相当复杂的。我在OGL或DX中看过的大部分书都有很好的介绍,可以解释函数/类的功能。
一旦掌握了其中一个,您就可以随时深入了解库,看看他们正在做些什么来降低价格。
或者,如果你真的,绝对必须学习最低级别......请阅读上述帖子中的书。
答案 7 :(得分:2)
libX11是X11的最低级库。我相信opengl / directx直接与驱动程序/硬件通信(或模拟不支持的操作),因此它们将是最低级别的库。
如果您想从非常低级编程开始,请查找VGA的x86汇编代码并启动dosbox或类似的副本。
答案 8 :(得分:1)
Vulkan api是一种api,可让您非常低级地访问gpu的大多数(如果不是全部)功能(包括计算和图形功能),它可以在amd和Nvidia gpus(并非全部)上工作
您也可以使用CUDA,但它仅适用于Nvidia GPU,并且只能访问计算功能,而没有视频输出。