我开始在Linux中做一些低级的3D编程。我有很多使用高级图形API OpenInventor的经验。
我知道完全没有必要知道这些事情是如何结合在一起的,但我只是好奇而已。我知道OpenGL只是图形应用程序的一个标准。Mesa3D似乎是该标准的开源实现。
那么GLX和DRI适合哪里呢?在维基百科和所有这些网站上翻查,我还没有找到一个解释这一切是如何一起进行的。硬件加速在哪里发生?专有驱动程序与此有什么关系?
发布于 2012-09-16 19:37:30
除了OpenGL,我从来没有使用过那些库,但我会尝试通过阅读维基百科页面来猜测,就像你一样。
关于梅萨你看上去是对的。以下是我们获得的其他信息:
“X窗口系统是一种计算机软件系统和网络协议,它为联网计算机提供了基础GUI它创建了一个硬件抽象层。“
GLX使希望使用OpenGL的程序能够在X窗口系统提供的窗口中这样做。
-X协议的扩展,它允许客户端发送3D呈现命令--X服务器的扩展,该服务器接收来自客户端的呈现命令并将它们传递给已安装的OpenGL库
如果客户端和服务器在同一台计算机上运行,并且可以使用加速的3D图形卡,则DRI可以绕过前两个组件.然后允许客户端程序直接访问图形硬件。“
直接渲染基础设施是一个在X窗口系统中使用的接口,它允许用户应用程序访问视频硬件,而不需要数据通过X服务器.“
OpenGL是一个C++ 3D图形API,旨在为OpenGL提供更高层次的编程
为了使事情更简单,让我们想象一下在每个API的入口和出口都会出现一个简化的数据流(和命令流)。在一开始,我们有您的应用程序(编译的代码),您从您的计算机运行。在最后,我们有图像显示在您的屏幕上。
有几个例子,我会限制这些问题的答案:
-does您的计算机有图形卡(GPU),还是只有一个CPU,来处理图形功能?
-is你的应用程序嵌入了x窗口系统的窗口?
-if您使用x窗口系统,"x服务器“是在您的计算机上运行,还是在网络上的其他计算机上运行?
如果您有GPU的驱动程序,我将假设您有驱动程序,如果您有GPU的驱动程序,则假设您有用于软件渲染的Mesa )。
第一个场景:您运行一个用OpenInventor编写的图形应用程序,而不使用X窗口系统,并且没有图形卡。程序流将非常类似于:
Your application
↓ (uses functions of)
OpenInventor
↓ (calls functions declared by)
OpenGL
↓ (redirects function calls to implementation defined by)
Mesa
↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
↓
3D Images on your screen
这里发生的事情叫做“软件渲染”:图形命令不是由任何图形硬件处理的,而是由通常运行软件的处理器CPU处理的。
第二个场景:现在想象一下,在与上面相同的条件下,您有一个图形卡。流程看起来会更像这样:
Your application
↓ (uses functions of)
OpenInventor
↓ (calls functions declared by)
OpenGL
↓ (redirects function calls to implementation defined by)
Proprietary Drivers
↓ (converts OpenGL commands to GPU commands)
Graphic Card
↓
3D Images on your screen
现在发生的事情被称为“硬件加速”,通常比第一种情况要快。
第三个场景:现在让我们介绍X窗口系统流程,或者至少我认为它是怎样的,基于我读到的几行Wikipedia。
让我们暂时忘掉图形硬件和API。流程应该如下所示:
Your application (X Window System sees it as an "X Client")
↓ (sends requests defined by the X Window System Core Protocol)
X Server
↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
↓
Windows or 2D images on your screen
注意,当使用X窗口系统时,您的屏幕和运行应用程序的计算机可能不是“直接”连接的,而是可以通过网络连接的。
第四个场景:假设您想从前面的示例中向您的X客户端应用程序添加花哨的3D图形渲染。在我看来,X系统最初无法做到这一点,或者至少它需要大量复杂的代码来执行相当于OpenGL API函数的操作。
幸运的是,您可以使用GLX向系统添加对OpenGL命令的支持。你们现在有:
Your application
↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
↓ (convert your request to OpenGL commands)
OpenGL
↓ (redirects function calls to implementation defined by)
...
现在,您可以在第一个场景中将最后一个箭头重新连接到"OpenGL“之后的那个箭头:您可以在屏幕上获得3D图像!
最后,关于我认为对DRI的理解:
它似乎允许Mesa访问GPU,因此可以将第一个场景的流程修改为:
...
↓
Mesa
↓ (forwards OpenGL commands)
DRI
↓ (converts OpenGL commands to GPU commands)
Graphic Card
↓
3D Images on your screen
而且在使用GLX时,它似乎也短路了,条件是它的服务器和客户端在同一台计算机上,而且您有一个GPU。在这种情况下,我们的第四个场景的图将简单地变成:
Your application
↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
↓
3D Images on your screen
就这样!
现在请记住,我不是Unix环境方面的专家,所以我最好的建议是研究每个API的文档,以准确地了解它们能做什么。
将先前的图表组合成一个单一的图表,可能会使事情更容易理解。我让这作为对你的锻炼!
发布于 2012-09-17 14:56:53
OpenGL与平台无关;这意味着OpenGL API与平台无关。
OpenGL状态和缓冲区由抽象对象(通常称为上下文)收集。
宿主平台负责提供一些API来为底层平台创建OpenGL上下文。在Windows上有wgl*例程(Windows ),在Unix上有glX*例程(GlX)。
实际上,GLX只是一个允许应用程序创建OpenGL上下文以便使用OpenGL API的API。
常见的WGL/GLX操作是创建窗口,创建屏幕外缓冲区,使OpenGL上下文当前在线程上,交换绘制缓冲区.
相反,DRI是一个内核层,它允许通过传递XServer与图形卡直接通信,从而确实加快了使用OpenGL例程的应用程序。
发布于 2014-03-09 08:30:40
http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html
直接渲染基础设施,也称为DRI,是一个框架,允许直接访问X窗口系统下的图形硬件以一种安全和有效的方式。它包括对X服务器、多个客户端库和内核(DRM、直接呈现管理器)的更改。DRI最重要的用途是创建快速的OpenGL实现,为Mesa提供硬件加速。一些3D加速驱动程序已经写入了DRI规范,包括3 3DFX、AMD (原ATI)、Intel和Matrox生产的芯片组的驱动程序。
https://softwareengineering.stackexchange.com/questions/164997
复制相似问题