Direct3D和OpenGL指令在图形卡中是如何处理的?

11
我正在努力理解GPU的工作方式,并且对于它们如何处理像Direct3D或OpenGL这样的高级API感到困惑。很常见看到显卡广告声称支持Direct3D和OpenGL硬件加速。这是否意味着它们直接在硬件中处理Direct3D和OpenGL指令?
我还没有找到明确的证据,无论是它们被编译成GPU可以处理的汇编表示法,还是有任何转换过程。如果有这样的转换,那么谁会执行?是软件库(Direct3D/OpenGL),驱动程序还是GPU本身?
同样,在哪里定义了图形管线?在GPU硬件、驱动程序还是软件库中?这让我特别困惑,尤其是可编程管线的概念。
有没有好的资源可以找到这些详细信息?
3个回答

13

您提出了一个非常广泛且复杂的问题。实际上,您提出了几个广泛且复杂的问题。

管理硬件操作的软件称为硬件的“驱动程序”。自然地,对于图形硬件,这称为“图形驱动程序”。像所有驱动程序一样,图形驱动程序实际上是操作系统(OS)中可安装的部分;操作系统使图形驱动程序能够执行其工作并与硬件交互。两者相辅相成。

实际上有两种D3D或OpenGL(以下简称“API”)调用:那些与驱动程序交互的和那些不需要交互的。每个实际绘制某些内容的调用都需要(最终)与驱动程序交互,但设置稍后绘制调用的调用可能只是本地存储数据。

当您进行绘制调用时,API会进行一些检查,以确保您作为用户已经进行了有效的渲染调用。如果是这样,API就有一些选择。事实证明,直接与驱动程序通信需要很长时间,无论您何时开始通信,都需要很多命令。因此,通常发生的是,API会存储您的渲染调用并立即返回。然后,在另一个线程中,它可能会查看已存储多少个渲染调用。如果有“足够的”,则将它们转发给驱动程序。这称为“编组”。

驱动程序的工作是接收并转换已转发的这些调用,以执行GPU所需的操作。

在同一条线上,图形管道定义在哪里?在GPU硬件、驱动程序还是软件库中?

事实上,这现在是一个非常棘手的问题,并且随着每个硬件代之后变得更加棘手。

在过去,图形管线的构建严格受 GPU 硬件控制。但现在这种情况相对较少,虽然还是有一些硬件控制。在现代硬件上(支持 OpenGL 3.0 或 Direct3D10 或更好),如果你直接访问图形驱动程序,理论上可以设计一个使用略微改变版本的图形管线的 API。因此,API 决定了大部分图形管线的外观。

渲染管线中的每个阶段都会从前面的阶段输出值作为输入,并生成一些值作为输出。如果生成输出值的机制涉及执行用户提供的程序(称为“着色器”),则该阶段是“可编程”的。因此,目前并不存在可编程的管线;只有固定管线的可编程阶段。


1
非常感谢。我很清楚我的问题有多么广泛...对此感到抱歉,但感谢您花时间给我提供如此好的答案。它澄清了许多事情。如果我理解正确,API会验证调用、将它们分组,并最终通过系统调用向驱动程序发送累积的调用。这些传递给驱动程序的调用更像是汇编、高级Direct3D/OpenGL命令还是两者都不像? - cloudraven
驱动程序只是操作系统加载的.dll或其他形式的库。它只是常规代码,它像常规代码一样接收函数调用。传递给驱动程序的数据结构的外观取决于实现(即使是同一操作系统上的驱动程序也会发生变化),对于不实际编写驱动程序的任何人来说,这最终都是无关紧要的。 - Nicol Bolas
1
抱歉我来晚了,但有一个后续问题:API(OpenGL或DirectX)如何知道如何与所有不同的驱动程序通信?有Nvidia驱动程序、AMD/ATI驱动程序和许多版本的每个驱动程序?应用程序链接到一组特定版本的OpenGL,因此如果我更新我的驱动程序,旧版本的OpenGL如何知道如何与我的驱动程序通信?驱动程序和OpenGL之间的协调是如何工作的? - pomeroy
加载OpenGL可安装客户端驱动程序 - aztack

7
没有所谓的D3D或OGL指令。Direct3D或OpenGL将调用图形驱动程序,并执行它们需要完成的任何操作。这在着色器方面并不完全正确,因为它们在API(D3D / OGL)级别上具有统一的字节码,在这种情况下,API提供编译器,但据我所知,在执行之前仍以硬件相关方式进行转换。当然,Direct3D和OpenGL还包括用户模式组件以提高性能或提供更好的界面-例如,它们将批处理对内核的调用以减少上下文切换。
GPU制造的现实是,Microsoft和nVidia / ATi会聚在一起考虑他们想要什么以及可行的实现方法,并提出一个组规范,因为现实情况是,如果主要硬件和软件供应商不合作,所有这些都不起作用。没有人会购买不支持DirectX的GPU-也没有人会购买没有GPU实现DirectX的Windows。当然,“没有人”是相对的-但对所有相关方来说,这将是巨大的损失,当然,如果您有一个仅构建为D3D10 API的游戏,则支持D3D10的驱动程序是运行游戏的必备条件-有效地通过增加软件的运行范围来增加产品的价值,这是一个卖点。这意味着由硬件供应商或软件供应商定义的语义差异是微小的,实际上-特别是因为PC上唯一两个真正的3D渲染API,OpenGL和Direct3D,就图形管道而言,遵循非常相似的模型,据我所知。
然而,对于新的可编程GPU,您可以认为图形管道实际上并不存在-如果您有耐心进行编程,则可以将DX11设备用于您可以构想的任何图形管道。
最终,GPU受到强大的驱动程序级抽象保护。它实现了C样式接口,以及在该实现中允许或必要的所有内容。之后的一切都是完全实现定义的。
您可以查看MSDN文档以编写图形驱动程序。我看过它,但没有方便的链接,并描述了您必须遵守的接口和其他事项。

那确实很有道理。看看驱动程序应该如何编写,应该能够非常准确地回答我所有的问题。我会去检查一下。 - cloudraven

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接