【发布时间】:2011-06-20 17:01:46
【问题描述】:
您可能知道,C++ 没有标准的图形库。大多数游戏使用 DirectX 或 OpenGL。
但是这些库实际上是如何工作的呢?换句话说,如果C++没有机制,第三方库怎么画图呢?它们只是用另一种语言编写的吗?
【问题讨论】:
您可能知道,C++ 没有标准的图形库。大多数游戏使用 DirectX 或 OpenGL。
但是这些库实际上是如何工作的呢?换句话说,如果C++没有机制,第三方库怎么画图呢?它们只是用另一种语言编写的吗?
【问题讨论】:
他们会将呼叫转移到驱动程序,驱动程序会将它们发送到显卡。
【讨论】:
DirectX 和 OpenGL 在相当低的级别上运行。那就是你说“画一个三角形,现在画一个正方形”。通常,程序员然后将这些调用包装到提供更高级别功能的 C++ 类中,例如“绘制模型,绘制树”。这被称为引擎。
我建议您查看 NeHe 教程以获取更多信息:http://nehe.gamedev.net/
例如,在 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),但大多数程序员只会使用单行内联汇编 sn-p。
即使是现在,大多数视频硬件交互都归结为这两种途径 - 帧缓冲区和 I/O 端口(DMA 和中断通常不用于图形)。但是我们应用程序级的程序员看不到这些。这是驱动程序的东西。
一个现代警告与保护模式有关;在保护模式下,C 指针不与底层物理地址相同。即使在内核模式下,简单地将 0xA0000 类型转换为指针也不会让您进入帧缓冲区。但是,内核级代码(即驱动程序)可以请求内存管理器给它一个对应于特定物理地址的指针。
【讨论】: