Opengl 如何使用C或C+与图形卡进行接口+;?

Opengl 如何使用C或C+与图形卡进行接口+;?,opengl,graphics,Opengl,Graphics,库如OpenGL访问图形卡并可以生成图形程序,这些库是如何使用C++实现的。那么这些库是如何用C编写的呢?同样的问题也适用于声音 C/C++语言的其他功能(如图形、声音、internet访问)是否用低级语言编写,然后使用库提供给C/C++ 我会感谢任何能纠正我的概念的总结,或任何在网络或书籍上的建议阅读 OpenGL并不是一个真正的库。这是一个规范。系统上的opengl32.dll或libGL.dll只是非常薄的层,可以与GPU驱动程序通信 根据我所听到的,C和C++不提供语言中的图形特征,并且

库如OpenGL访问图形卡并可以生成图形程序,这些库是如何使用C++实现的。那么这些库是如何用C编写的呢?同样的问题也适用于声音

C/C++语言的其他功能(如图形、声音、internet访问)是否用低级语言编写,然后使用库提供给C/C++


我会感谢任何能纠正我的概念的总结,或任何在网络或书籍上的建议阅读

OpenGL并不是一个真正的库。这是一个规范。系统上的opengl32.dll或libGL.dll只是非常薄的层,可以与GPU驱动程序通信

根据我所听到的,C和C++不提供语言中的图形特征,并且需要图形库。那么这些库是如何用c编写的呢

操作系统提供与硬件对话的功能。驱动程序使用这些设施来驱动(因此得名)硬件。例如,写入序列a、B、C、D可能会使某些特定的GPU向帧缓冲区绘制一个三角形

我已经在这里解释了这些事情(我在这里逐字引用):

这个问题几乎是不可能回答的,因为OpenGL本身 只是一个前端API,只要实现遵循 规范和结果符合这一点,它可以做任何事情 你喜欢的方式

问题可能是:OpenGL驱动程序如何在 最低级别。现在,作为一个整体,一般来说,这是不可能回答的 驱动程序与某个硬件紧密相连,这可能再次发生 不管开发人员如何设计它

因此,问题应该是:“它的平均落后程度如何 OpenGL和图形系统的场景。让我们看看这个 自下而上:

  • 在最底层有一些图形设备。现在,这些GPU提供了一组寄存器来控制它们的操作 (哪个寄存器完全取决于设备)有一些程序内存 对于着色器,输入数据(顶点、纹理等)的大容量内存和 到系统其余部分的I/O通道,通过该通道接收/发送数据 数据和命令流

  • 图形驱动程序跟踪GPU状态以及使用GPU的所有资源应用程序。也是 负责转换或任何其他处理发送的数据 应用程序(将纹理转换为 GPU,在GPU的机器代码中编译着色器)。而且 为应用程序提供一些抽象的、依赖于驱动程序的接口 节目

  • 然后是依赖于驱动程序的OpenGL客户端库/驱动程序。在Windows上,通过代理在Unix上通过opengl32.dll加载此文件 该系统位于两个位置:*X11 GLX模块和驱动程序 依赖GLX驱动程序*和/usr/lib/libGL.so可能包含一些驱动程序 直接渲染的相关内容

    在MacOS X上,这恰好是“OpenGL框架”

    正是这一部分将OpenGL调用转换为调用 到驱动程序部分中描述的驱动程序特定功能 在第(2)段中

  • 最后,在Windows和Unix/usr/lib/libGL.so上实现了实际的OpenGL API库opengl32.dll;这主要是传递命令 要正确使用OpenGL实现

  • 无法概括实际沟通的方式:

    在Unix中,34连接可以通过套接字进行(是的,它是 可以,如果您愿意,也可以通过网络)或通过共享 记忆。在Windows中,接口库和驱动程序客户端是 两者都加载到进程地址空间中,所以没有那么多 通信,但简单的函数调用和变量/指针传递。 在MacOS X中,这类似于Windows,只是没有分隔 在OpenGL接口和驱动程序客户端之间(这就是为什么 MacOSX跟不上OpenGL的新版本,总是很慢 需要完整的操作系统升级才能提供新的 框架)

    32之间的通信可通过ioctl、读/写或 通过将一些内存映射到进程地址空间并配置 当内存发生变化时,MMU将触发一些驱动程序代码 完成了。这在任何操作系统上都非常相似,因为 始终必须跨越内核/用户区的边界:最终你要 通过一些系统调用

    系统和GPU之间的通信通过外围总线进行 以及它定义的访问方法,比如PCI、AGP、PCI-E等,它们都可以工作 通过端口I/O、内存映射I/O、DMA、IRQ

    更新

    答案是,如何从C程序(比如用C编写的OS内核和/或驱动程序)接口实际硬件:


    C标准本身将地址视为纯粹抽象的东西。您可以将指针强制转换为uintptr\t,但只有在强制转换回指针时,您获得的数值才需要遵循指针算术。否则,该值可能与地址空间无关。实现对C的硬件访问的唯一安全方法是按照所用C实现和系统的ABI在汇编中编写最低级别的内容

    所有合适的操作系统都是这样做的。在C语言中,从不将地址转换为指针!操作系统在汇编程序中实现了这一点,与系统的C编译器相匹配。在汇编中编写的代码作为可在C中调用的函数导出。内核将这些函数提供给GPU驱动程序。因此,链条是:

    应用程序→ [OpenGL API层→ 供应商OpenGL i