OpenGL如何在最低级别工作?
我了解如何编写OpenGL/DirectX程序,我知道其背后的数学和概念,但我很好奇GPU-CPU通信如何在低水平上工作 假设我有一个用C编写的OpenGL程序,它显示一个三角形并将相机旋转45度。当我编译这个程序时,它会被转换成一系列ioctl调用,然后gpu驱动程序向gpu发送相应的命令,在gpu中,所有旋转三角形和以适当颜色设置适当像素的逻辑都被连接到了gpu中?或者该程序将被编译成“gpu程序”,加载到gpu上并计算旋转等。?还是完全不同的东西 编辑: 几天后,我发现了这个系列文章,基本上回答了这个问题:OpenGL如何在最低级别工作?,opengl,gpu,Opengl,Gpu,我了解如何编写OpenGL/DirectX程序,我知道其背后的数学和概念,但我很好奇GPU-CPU通信如何在低水平上工作 假设我有一个用C编写的OpenGL程序,它显示一个三角形并将相机旋转45度。当我编译这个程序时,它会被转换成一系列ioctl调用,然后gpu驱动程序向gpu发送相应的命令,在gpu中,所有旋转三角形和以适当颜色设置适当像素的逻辑都被连接到了gpu中?或者该程序将被编译成“gpu程序”,加载到gpu上并计算旋转等。?还是完全不同的东西 编辑: 几天后,我发现了这个系列文章,基本
C/C++编译器/链接器只做一件事:它们将文本文件转换为一系列在CPU上运行的特定于机器的操作码。OpenGL和Direct3D只是C/C++API;他们无法神奇地将C/C++编译器/链接器转换为GPU的编译器/链接器 您编写的每一行C/C++代码都将在CPU上执行。对OpenGL/Direct3D的调用将调用C/C++库,静态或动态(视情况而定) 只有在代码显式创建着色器的情况下,“gpu程序”才会发挥作用。也就是说,如果对OpenGL/D3D进行API调用,从而导致着色器的编译和链接。为此,您(在运行时,而不是在C/C++编译时)生成或加载用某种着色器语言表示着色器的字符串。然后将它们推送到着色器编译器中,并在该API中获取表示该着色器的对象。然后将一个或多个着色器应用于特定的渲染命令。这些步骤中的每一步都显式地按照C/C++代码的方向进行,正如前面所述,C/C++代码在CPU上运行
许多着色器语言使用类似C/C++的语法。但这并不意味着它们等同于C/C++。您的程序不是为任何特定的GPU编译的;它只是动态链接到一个将实现OpenGL的库。实际实现可能涉及将OpenGL命令发送到GPU、运行软件回退、编译着色器并将其发送到GPU,甚至使用着色器回退到OpenGL命令。图形环境相当复杂。谢天谢地,链接将您与大多数驱动程序的复杂性隔离开来,让驱动程序实现者可以自由地使用他们认为合适的任何技术 当我编译这个程序时,它会被转换成一系列ioctl调用,然后gpu驱动程序向gpu发送相应的命令,在gpu中,所有旋转三角形和以适当颜色设置适当像素的逻辑都被连接到了gpu中?或者该程序将被编译成“gpu程序”,加载到gpu上并计算旋转等 你不远了。您的程序调用可安装的客户端驱动程序(它不是真正的驱动程序,而是用户空间共享库)。这将使用ioctl或类似的机制将数据传递给内核驱动程序 对于下一部分,它取决于硬件。较旧的视频卡有一个所谓的“固定功能管道”。视频卡中有用于矩阵的专用内存空间,以及用于纹理查找、混合等的专用硬件。视频驱动程序将为每个单元加载正确的数据和标志,然后设置DMA以传输顶点数据(位置、颜色、纹理坐标等)
较新的硬件在显卡中有处理器内核(“着色器”),这与CPU的不同之处在于,它们的运行速度要慢得多,但有更多的处理器内核并行工作。对于这些视频卡,驱动程序准备程序二进制文件以在GPU着色器上运行。这个问题几乎不可能回答,因为OpenGL本身只是一个前端API,只要实现符合规范,并且结果符合规范,就可以按您喜欢的方式执行 问题可能是:OpenGL驱动程序如何在最低级别上工作。现在,一般来说,这又是不可能回答的,因为驱动程序与某个硬件紧密相连,无论开发人员如何设计,这些硬件都可能再次起作用 所以问题应该是:“在OpenGL和图形系统的幕后,它的平均外观如何?”。让我们从下往上看:
- X11 GLX模块和依赖于驱动程序的GLX驱动程序
- 和/usr/lib/libGL.so可能包含一些用于直接渲染的依赖于驱动程序的内容