我很有兴趣了解可用于制作图形应用程序的不同抽象层.
我看到很多术语被抛出:在最高级别的抽象中,我听说过C#,.NET,pyglet和pygame之类的东西.再往下,我听说DirectX和OpenGL.然后是DirectDraw,SDL,Win32 API以及其他多平台库,如WxWidgets.
如何才能很好地了解其中一个层的结束位置以及下一个层的开始位置?什么是在Windows中创建窗口的"最低级别"方式?那么C++呢?(代码示例将是神圣的.)在X11中怎么样?OpenGL和DirectX的Windows实现是否构建在Win32 API之上?我在哪里可以开始了解这些事情?
关于SO的另一个问题是建议编程Windows.Linux怎么样?有没有相当于这样的书?
我知道这是非常低级的,并且有许多更友好的工具可用,但我想至少学习表面下发生的事情的基础知识.我想尽可能地开始甩掉窗户和矢量,从像pygame这样的东西开始对我来说太高级了; 我真的需要制作完整的概念电路,介绍如何在计算机上绘制内容.
我一定会欣赏有关书籍和资源的建议,但我认为如果这个问题的答案充满了许多不同的方法来通过不同的图形编程方法来获得"Hello world",那将是非常酷的.C?C++?使用OpenGL?使用DirectX?在Windows XP上?在Ubuntu上?也许我要求太多了.
最低级别是显卡的视频RAM.当计算机首次启动时,通常将图形卡设置为80x25字符的传统模式.
此时,您可以使用BIOS提供的中断来编写文本.您还可以从16种不同颜色的调色板中更改前景色和背景色.您可以使用访问端口/寄存器来更改显示模式.此时您可以说,将不同的字体加载到显示内存中并仍然使用80x25模式(操作系统安装通常会这样做),或者您可以继续启用VGA/SVGA.它非常复杂,这就是驱动程序的用途.
一旦卡处于"更高"模式,您将通过访问映射到视频卡的内存来更改屏幕上的内容.它是逐像素地水平存储的,带有一些像素的"脏区",这些像素没有映射到每行末尾的屏幕,你必须补偿它.但是,你可以将内存中图像的像素直接复制到屏幕上.
对于像DirectX,OpenGL这样的东西.而不是直接写入屏幕,命令被发送到图形卡,并自动更新其屏幕.像"嘿你,画这个图像我已经加载到VRAM这里,这里和这里"或"用这个变换矩阵绘制这些三角形......"这样的命令与逐像素相比只需要一小部分时间.CPU会谢谢你.
DirectX/OpenGL是一个程序员友好的库,用于将这些命令发送到具有所有支持功能的卡,以帮助您顺利完成.更直接的方法只会是徒劳的.
SDL是一个抽象层,因此不必费心阅读它,我猜它会在每个系统上有不同的工作方式.一方面它可能使用半直接屏幕写入,另一方面是Direct3D等.只要代码保持跨平台可用,最快的是什么.
GDI/GDI +和XWindow系统.它们专门用于绘制窗户.最初他们使用逐像素方法绘制(这很好,因为他们只需要在按下按钮或移动窗口时重绘等),但现在他们使用Direct3D/OpenGL来加速绘图(和特殊的效果).优化取决于这些库的版本和实现.
因此,如果您想获得最大的功率和速度,DirectX/openGL就是您的最佳选择.SDL对于从跨平台环境中获得最大收益并且无论如何都可以与OpenGL集成非常有用.窗口系统是最后一个但不要低估它.特别是微软近来提出的问题.
Michael Abrash的图形编程"黑皮书"是一个很好的起点.另外,您可以免费下载!
如果你真的想从底部开始,那么绘制一条线是最基本的操作.计算机图形只是填充网格(屏幕)上的像素,因此您需要确定要填充哪些像素以获得从(x0,y0)到(x1,y1)的线.
查看Bresenham的算法,了解所涉及的内容.
成为一名优秀的图形和图像处理程序员并不需要那么低的知识,但是我确实讨厌对正在使用的内容一无所知。我看到两种方法可以实现这一目标-高层下降或底层上升。
自上而下是一个跟踪动作如何从高级图形操作(例如绘制圆)到硬件的轨迹的问题。熟悉OpenGL。然后,Mesa的源代码(免费!)提供了有关如何在软件中实现OpenGL的信息。接下来是Xorg的源代码,首先是要了解操作如何从API调用通过客户端到X服务器。最后,您将深入研究与硬件接口的设备驱动程序。
自下而上:构建自己的图形硬件。考虑一下它可以连接到计算机的方式-如何通过几个字节大小的寄存器处理大量像素,DMA如何工作。编写设备驱动程序,然后尝试设计可能对应用程序程序员有用的图形库。
自下而上的方式是我几年前从慢8位微处理器实现时学到的。电路和软硬件接口的直接经验使我很好地理解了艰难的设计决策-例如使用聪明的硬件,在设备驱动程序或更高级别中绘制矩形。这些都不是日常实用的价值,而是提供了了解新技术的知识基础。