C+的内部工作+;图形库 正如你可能知道的,C++没有标准的图形库。大多数游戏使用DirectX或OpenGL

C+的内部工作+;图形库 正如你可能知道的,C++没有标准的图形库。大多数游戏使用DirectX或OpenGL,c++,graphics,C++,Graphics,但是这些库实际上是如何工作的呢?换句话说,如果C++中没有第三方库,那么第三方库怎么能绘制图形呢?它们是用另一种语言编写的吗?它们会将呼叫转移到驱动程序,驱动程序会将呼叫发送到图形卡。DirectX和OpenGL的操作级别非常低。那就是你说“画一个三角形,现在画一个正方形”。通常,程序员将这些调用封装到提供更高级别功能的C++类中,例如“绘制模型,绘制树”。这就是所谓的发动机 我建议查看NeHe教程以了解更多信息: 例如,在OpenGL中绘制三角形的调用如下所示: GLBegin(BEGIN_

但是这些库实际上是如何工作的呢?换句话说,如果C++中没有第三方库,那么第三方库怎么能绘制图形呢?它们是用另一种语言编写的吗?

它们会将呼叫转移到驱动程序,驱动程序会将呼叫发送到图形卡。

DirectX和OpenGL的操作级别非常低。那就是你说“画一个三角形,现在画一个正方形”。通常,程序员将这些调用封装到提供更高级别功能的C++类中,例如“绘制模型,绘制树”。这就是所谓的发动机

我建议查看NeHe教程以了解更多信息:


例如,在OpenGL中绘制三角形的调用如下所示:

GLBegin(BEGIN_POLYGONS);
GLVector3(0,0,0);
GLVector3(10,10,0);
GLVector3(-10,10,0);
GLEnd();

正如我所说的,请参见上面指向NeHe教程的链接,它们都是C/C++

的,特别是DirectX和OpenGL,通过调用操作系统和/或视频硬件驱动程序来工作。驱动程序通过与图形设备交互来绘制实际图形。互动的具体细节因视频卡而异

回到DOS时代,C++程序员可以直接与硬件一起工作。这是通过两种方式实现的。首先,通过写入/读取存储像素或文本的特殊内存块(“帧缓冲区”)。这是一个已知地址的内存范围,因此要使用它,必须将一个整数常量转换为指针,然后使用该指针。纯粹的C++机制。另一种交互方式是读/写I/O端口。现在,这是一种C不直接支持的机制,除非您将内联汇编或编译器内部函数计算在内。有两个库函数可以包装这两个操作(字面上是围绕两个CPU命令的包装器-INP和OUTP),但大多数程序员只会使用一行内联汇编代码段

即使现在,大多数视频硬件交互都归结为这两种途径——帧缓冲区和I/O端口(DMA和中断通常不用于图形)。但我们应用程序级程序员看不到这些。这是司机的事


一个现代警告与保护模式有关;在保护模式下,C指针与底层物理地址不同。即使在内核模式下,简单地将0xA0000类型转换为指针也无法获得帧缓冲区。但是,内核级代码(即驱动程序)可以请求内存管理器给它一个对应于特定物理地址的指针。

引擎通常是一个更高级别的概念,位于场景图的顶部。除非引擎包含屏幕图。Ogre3D、Crystal Space、XNA和Irrlicht都是引擎,都包含屏幕图,但它们如何通过调用标准C函数来表示“绘制三角形”…见上文^^^^有点晚了,但引擎包含场景图并不意味着它不是概念上独立的概念。场景图是用于管理渲染三维数据的数据结构。引擎管理场景图内容,以及其他内容。您确定不使用DMA吗?ISTR是关于耗尽图形内存和从/到主内存的分页纹理。DMA通常用于逐个发送字节的流设备-硬盘驱动器和网卡。但无论如何,从软件方面来说,“使用”DMA归结为端口I/O,在其中一些端口中指定要读取/写入的内存地址。其余部分由设备本身完成。@SevaAlekseyev:现代GPU通常有一整套DMA引擎,具有分散/收集功能。