如何在显卡中处理Direct3D和OpenGL指令?

时间:2011-06-15 01:55:43

标签: opengl graphics direct3d gpu-programming

我试图更好地理解GPU是如何工作的,我对他们如何处理Direct3D或OpenGL等高级API感到困惑。看到图形卡广告它们支持Direct3D和OpenGL硬件加速是很常见的。这是否意味着他们直接在硬件中处理Direct3D和OpenGL指令? 我无法找到明确的证据,或者将它们编译成GPU可以处理的汇编表示。如果有这样的转换谁做到了?软件库(Direct3D / OpenGL),驱动程序还是GPU本身? 在同一行,图形管道定义在哪里?在GPU硬件,驱动程序或软件库中?这让我特别对可编程管道的想法感到困惑。

是否有一个很好的资源,我可以找到有关这些细节的信息?

3 个答案:

答案 0 :(得分:9)

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

对任何硬件的操作进行最终治理的软件称为硬件的“驱动程序”。当然,对于图形硬件,这被称为“图形驱动程序”。与所有驱动程序一样,图形驱动程序实际上是操作系统的可安装部分;操作系统允许图形驱动程序完成其工作并与硬件通信。两者携手合作。

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

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

驱动程序的工作是接受已转发的这些调用并将其转换为GPU将执行的操作。

  

在同一行上,图形管道定义在哪里?在GPU硬件,驱动程序或软件库中?

这些日子实际上是一个非常棘手的问题,而且每一代硬件都变得越来越棘手。

在过去,GPU硬件严格控制图形管道的构建。这些天,虽然有一些硬件控制,但事实并非如此。在现代硬件(能够支持OpenGL 3.0或Direct3D10或更高版本)上,理论上如果您可以直接访问图形驱动程序,设计一个使用稍微改变版图形管道的API。所以API决定了图形管道的大部分内容。

渲染管道中的每个阶段都将来自宝贵阶段的某些值作为输入,并生成一些数值作为输出。如果用于从输入生成输出的机制涉及执行用户提供的程序(称为“着色器”),则阶段是“可编程的”。所以没有可编程管道(尚未);只是固定管道的可编程阶段。

答案 1 :(得分:7)

没有D3D或OGL指令这样的东西。 Direct3D或OpenGL将调用图形驱动程序,他们将执行他们需要做的任何事情来实现它。对于着色器来说,这不是完全 true,它在API(D3D / OGL)级别有一个统一的字节码,在这种情况下,API提供了一个编译器,但就我而言知道,在执行之前仍然以硬件相关的方式进行转换。当然,Direct3D和OpenGL还包括用户模式组件以提高性能或提供更好的界面 - 例如,他们将批量调用内核以减少上下文切换。

GPU制作的现实是微软和nVidia / ATi聚在一起思考他们想要什么以及实施什么是可行的,并提出了一个小组规范​​,因为现实情况是如果主要的话,这一切都不会起作用硬件和软件供应商没有合作。没有人会购买不支持DirectX的GPU,没有人会购买没有GPU实现DirectX的Windows。当然,“没人”是相对的 - 但对于所有相关人员而言,这将是一个巨大的损失,当然,如果你有一个仅针对D3D10 API的游戏,那么支持D3D10的驱动程序是运行游戏的必要条件 - 通过增加可运行的软件范围,有效地提高产品价值,这是一个卖点。这意味着由硬件供应商或软件供应商定义的语义差异是最小的,实际上 - 特别是因为PC上的唯一两个真正的3D渲染API,OpenGL和Direct3D,遵循非常类似的图形管道模型,我知道。

然而,使用新的可编程GPU,您可能会认为图形管道并不存在 - 如果您有耐心对其进行编程,DX11设备可用于您可以设想的任何图形管道。

最终,GPU受到强大的驱动程序级抽象的保护。它实现了一个C风格的接口,以及该实现中允许或必需的任何内容。之后的所有内容都是完全实现定义的。

您可以查看编写图形驱动程序的MSDN文档。我已经看过了,但没有方便的链接,它描述了你必须遵守的接口和其他东西。

答案 2 :(得分:3)

你已经有了两个非常好的答案。但也许最好的是,阅读AMD / ATI的GPU的实际编程文档:http://developer.amd.com/documentation/guides/pages/default.aspx#open_gpu

不幸的是,NVidia不会发布他们的作品。