【问题标题】:Inner Workings of C++ Graphics LibrariesC++ 图形库的内部工作原理
【发布时间】:2011-06-20 17:01:46
【问题描述】:

您可能知道,C++ 没有标准的图形库。大多数游戏使用 DirectX 或 OpenGL。

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

【问题讨论】:

    标签: c++ graphics


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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++ 语言

      【讨论】:

      • 引擎通常是一个更高层次的概念,它位于场景图之类的东西之上。
      • 除非您的引擎包含您的屏幕图。 Ogre3D、Crystal Space、XNA 和 Irrlicht 都是引擎,并且都包含屏幕图
      • 但是他们怎么说“画一个三角形?”
      • 通过调用标准C函数...见上文^^
      • 有点晚了,但仅仅因为引擎包含场景图并不意味着它不是一个概念上独立的概念。场景图是一种管理渲染 3D 数据的数据结构。引擎管理场景图内容等。
      【解决方案3】:

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

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

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

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

      【讨论】:

      • 您确定没有使用 DMA 吗? ISTR 关于耗尽图形内存和从/向主内存分页纹理的事情。
      • DMA 通常用于逐个发出字节的流设备——硬盘和网卡。但无论如何,从软件端“使用” DMA 归结为端口 I/O,在其中指定要读取/写入的内存地址。其余的由设备自己完成。
      • @SevaAlekseyev:现代 GPU 通常有一大堆具有分散/收集功能的 DMA 引擎。
      • 不过,设置 DMA 硬件归结为 I/O 端口操作。
      猜你喜欢
      • 2010-10-19
      • 2011-08-29
      • 2015-08-21
      • 2014-01-22
      • 1970-01-01
      • 2018-07-28
      • 2019-06-29
      • 2022-05-21
      • 2019-12-28
      相关资源
      最近更新 更多