我试图了解 OpenGL 和 DirectX 如何与显卡一起工作。
如果我在 OpenGL 中编写一个程序来做一个三角形,而另一个在 DirectX 中做同样的事情,那么 GPU 端到底发生了什么?
当我们运行程序时,每次调用 OpenGL 库和每次调用 DirectX 库都会为 GPU 生成代码,而这两个程序生成的 GPU 机器码是一样的吗? (就像如果 DirectX 和 OpenGL 就像 Java 字节码一样,预编译,那么当它实际运行时,它会产生同样的东西)
或者 GPU 是否有 2 个不同的指令集,每个指令集一个。我的意思是,GPU 的精确 OpenGL 和 DirectX 是什么,它如何区分 2 API?
这仅与程序员的角度不同吗?
最佳答案
我已经在这里回答了On Windows, how does OpenGL differ from DirectX?
以下是其中一个答案的完整引用
这个问题几乎不可能回答,因为 OpenGL 本身只是一个前端 API,只要实现符合规范并且结果符合此规范,就可以按照您喜欢的任何方式完成。
问题可能是:OpenGL 驱动程序如何在最低级别工作。现在这又是不可能的,因为驱动程序与某些硬件密切相关,这可能会再次执行开发人员设计的操作。
所以问题应该是:“它在 OpenGL 和图形系统的幕后平均看起来如何?”。让我们从下往上看:
由代理通过 opengl32.dll 加载,在 Unix 系统上,它位于两个位置:
在 MacOS X 上,这恰好是“OpenGL 框架”。
正是这部分将 OpenGL 调用转换为对 (2) 中描述的驱动程序部分中的驱动程序特定函数的调用。
实际通信是如何发生的不能一概而论:
在 Unix 中,3<->4 连接可能发生在套接字上(是的,它可能,并且如果你愿意,它确实会通过网络)或通过共享内存。在 Windows 中,接口(interface)库和驱动程序客户端都加载到进程地址空间中,因此没有太多的通信,而是简单的函数调用和变量/指针传递。在 MacOS X 中,这类似于 Windows,只是 OpenGL 接口(interface)和驱动程序客户端之间没有分离(这就是为什么 MacOS X 跟上新的 OpenGL 版本的速度如此缓慢的原因,它总是需要完整的操作系统升级才能提供新的框架)。
3<->2 之间的通信可以通过 ioctl、读/写或通过将一些内存映射到进程地址空间并配置 MMU 以在对该内存进行更改时触发一些驱动程序代码。这在任何操作系统上都非常相似,因为您总是必须跨越内核/用户空间边界:最终您会经历一些系统调用。
系统和 GPU 之间的通信通过外围总线及其定义的访问方法发生,因此 PCI、AGP、PCI-E 等通过端口 I/O、内存映射 I/O、DMA、IRQ 工作。
关于opengl - GPU 如何同时支持 OpenGL 和 DirectX API 执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923236/