【问题标题】:Can I use what I'd call "Raw OpenGL"? [duplicate]我可以使用我所谓的“原始 OpenGL”吗? [复制]
【发布时间】:2013-04-14 06:46:32
【问题描述】:

我想知道 OpenGL 的主界面。简单来说,OpenGL DLL是如何调用图形函数的? C++中有一些隐藏的隐藏渲染代码吗?如果它可以从 DLL 调用 GPU,那么它应该可以在任何 C++ 程序中使用。如果是这样,我可以为我的程序制作一些自己的 API 吗?要不然是啥?我希望这里有人知道。有人可以对这个主题有所了解吗?提前致谢!

【问题讨论】:

  • OpenGL 的全部意义在于以某种方式抽象硬件相关的细节......
  • 它仍在 DLL 中,这是我的问题。如果可以打包成DLL,那么就可以从exe访问。
  • 几家 GPU 制造商(尤其是 Nvidia)没有发布足够详细的硬件规格。他们给你的唯一东西就是一些 OpenGL 实现。
  • Intel 已经开源了他们的 Linux gfx 驱动程序,如果你想四处看看,也可以查看01.org/linuxgraphics,查看mesa3d.org

标签: c++ opengl dll native


【解决方案1】:

OpenGL DLL 像任何其他应用程序模块一样与 Ring 0 通信,调用类似 DeviceIoControl。传递给这些调用的数据的确切细节没有公开记录,而且不太可能改变。 GPU 制造商只是不愿意随意放弃这些信息。虽然您可能可以创建自己的 API,但与驱动程序对话的详细信息并不容易获得。

【讨论】:

  • 对 NVIDIA 来说当然是这样,但是任何有时间的人都可以查看 Intel 和 AMD/ATI 驱动程序的来源。
【解决方案2】:

一般意义上的答案是“是”,但要使其可行,必须在一定程度上“依赖于硬件”

您在最底层称为“图形函数”(您认为 OGL 所基于的东西)取决于硬件将图像帧构造成自身以及与处理器通信的方式。

有些硬件只是一个平面帧缓冲区,有些硬件能够自行管理矢量场景的光栅化过程。

有操作系统 API 是平面 2d 矢量和成像支持(如 GDI)甚至是三维建模系统(如 direc3d)。

OGL 只是一个 API:它定义了一组一致的函数原型来完成一项任务(描述一个 3D 场景)。 renderimg 进程被实现到 DLLS 中,这取决于它们必须使用的系统的性质。

其中一些只是在自己的缓冲区上操作,这些缓冲区将位图视为原始数据,以便通过 OS 本机 api 在屏幕上进行 Blit-ted(请参阅BitBlit),还有一些将 OGL 调用转换为对特定操作的调用代码到硬件设备的特定 io 端口。

由于 OGL 的流行,也有制造商正在标准化库和设备之间的“语言”。所以事情并不像看起来那样“线性”......

【讨论】:

    【解决方案3】:

    首先:现代 OpenGL 不是一个库,在 Windows 上,DLL 不包含与硬件对话的 OpenGL 实现。 opengl32.dll 仅充当占位符,驱动程序将其低级函数(称为 ICD)挂接到其中。

    我在这里详细回答了:https://stackoverflow.com/a/6401607/524368

    【讨论】:

      【解决方案4】:

      在 OpenGL 和其他标准化图形 API 被引入之前,直接写入硬件寄存器是图形编程的方式。

      一般来说,编写它是一场噩梦,几乎不可能调试。发明更高级别的 API 是有原因的。

      如今,您最接近硬件的是在控制台上,您在控制台上的访问权限仍然比在 PC 上低得多,但即使是这种访问权限也比过去更加抽象。

      如果你真的想这样做,你可以,但如果你不编写自己的操作系统,你基本上是在编写自己的驱动程序,而且你不会在现代 GPU 上找到太多公开可用的文档。

      【讨论】:

        猜你喜欢
        • 2013-01-24
        • 1970-01-01
        • 2022-06-14
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 1970-01-01
        • 2017-10-06
        相关资源
        最近更新 更多