我可以使用我称之为"Raw OpenGL"的东西吗?

Can I use what I'd call "Raw OpenGL"?

本文关键字:OpenGL Raw 可以使 称之为 我可以      更新时间:2023-10-16

我想知道关于OpenGL的主界面。简单地说,OpenGL DLL是如何调用图形函数的?在c++中是否有一些隐藏的渲染代码?如果它可以从DLL中调用GPU,那么在任何c++程序中都应该是可能的。如果是这样,我可以为我的程序制作一些我自己的API吗?还是别的什么?我希望这里有人知道。有人能解释一下这个问题吗?提前感谢!

首先,现代OpenGL不是一个库,在Windows上,DLL不包含与硬件对话的OpenGL实现。opengl32.dll仅仅作为一个占位符,驱动程序将其底层函数(称为ICD)钩入其中。

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

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

一般来说,答案是肯定的,但为了使其可行,它必须在某种程度上依赖于"硬件"

你所谓的"图形功能"(你认为OGL基于的东西)在最底层取决于硬件将图像帧结构到自身并与处理器通信的方式。

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

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

OGL只是一个API:它定义了一组一致的功能原型来完成一个任务(描述一个3D场景)。渲染过程被实现到dll中,这些dll根据它们必须使用的系统的性质而有所不同。

他们中的一些人只是在他们自己的缓冲区上操作,这些缓冲区将位图作为原始数据处理,通过操作系统原生api(见BitBlit)在屏幕上进行位图显示,其他一些人将OGL调用转换为对硬件设备特定io端口的特定操作码的调用。

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

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

一般来说,为它编写代码是一场噩梦,而且几乎不可能进行调试。高级api的发明是有原因的。

现在你能接触到的最接近硬件的设备是主机,在这里你仍然拥有比PC低得多的访问权限,但即使是这种访问权限也比过去更加抽象了。

如果你真的想这样做,你可以,但如果你不编写自己的操作系统,你基本上要编写自己的驱动程序,并且你不会找到很多关于现代gpu的公开可用文档。