您可能知道,C ++没有标准的图形库。大多数游戏都使用DirectX或OpenGL。
但这些图书馆实际上如何运作?换句话说,如果第三方库在C ++中没有机制,它如何绘制图形?它们只是用另一种语言写的吗?
答案 0 :(得分:6)
他们会将他们的电话转接到驱动程序,驱动程序会将它们发送到显卡。
答案 1 :(得分:6)
具体而言,DirectX和OpenGL通过调用操作系统和/或视频硬件驱动程序来工作。反过来,驱动程序通过与图形设备交互来进行实际绘图。交互的确切细节因视频卡而异。
回到DOS时代,C ++程序员可以直接使用硬件。这是通过两种方式完成的。首先,通过写入/读取存储像素或文本的特殊存储块(“帧缓冲区”)。它是一个已知地址的内存范围,因此要使用它,您必须将一个整型常量强制转换为指针并使用该指针。纯粹的C ++机制。另一种交互方式是读/写I / O端口。现在,这是一种C不直接支持的机制,除非您想要计算内联汇编或编译器内部函数。有两个库函数可以包装这两个操作(字面意思是,两个CPU命令的包装器 - INP和OUTP),但大多数程序员只会使用一行内联汇编代码段。
即使是现在,大多数视频硬件交互归结为这两种途径 - 帧缓冲和I / O端口(DMA和中断通常不用于图形)。但是我们应用级程序员不会看到这些。这是驱动程序。
一个现代警告与保护模式有关;在保护模式下,C指针不与底层物理地址相同。简单地将0xA0000强制转换为指针将无法使您进入帧缓冲区,即使在内核模式下也是如此。但是,内核级代码(即驱动程序)可以请求内存管理器为其指定与特定物理地址相对应的指针。
答案 2 :(得分:1)
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 ++