Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL如何在最低级别工作?_Opengl_Gpu - Fatal编程技术网

OpenGL如何在最低级别工作?

OpenGL如何在最低级别工作?,opengl,gpu,Opengl,Gpu,我了解如何编写OpenGL/DirectX程序,我知道其背后的数学和概念,但我很好奇GPU-CPU通信如何在低水平上工作 假设我有一个用C编写的OpenGL程序,它显示一个三角形并将相机旋转45度。当我编译这个程序时,它会被转换成一系列ioctl调用,然后gpu驱动程序向gpu发送相应的命令,在gpu中,所有旋转三角形和以适当颜色设置适当像素的逻辑都被连接到了gpu中?或者该程序将被编译成“gpu程序”,加载到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和图形系统的幕后,它的平均外观如何?”。让我们从下往上看:

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

  • 图形驱动程序跟踪GPU状态以及使用GPU的所有资源应用程序。它还负责转换或处理应用程序发送的数据(将纹理转换为GPU支持的像素格式,在GPU的机器代码中编译着色器)。此外,它还为应用程序提供了一些抽象的、依赖于驱动程序的接口

  • 然后是依赖于驱动程序的OpenGL客户端库/驱动程序。在Windows上,这会 通过opengl32.dll由代理加载,在Unix系统上,它位于两个位置:

    • X11 GLX模块和依赖于驱动程序的GLX驱动程序
    • 和/usr/lib/libGL.so可能包含一些用于直接渲染的依赖于驱动程序的内容
    在MacOS X上,这恰好是“OpenGL框架”

    正是这一部分将OpenGL调用转换为对(2)中描述的驱动程序部分中特定于驱动程序的函数的调用

  • 最后是实际的OpenGL API库,即Windows和Unix/usr/lib上的opengl32.dll/