我想知道OpenGL的主界面。简单来说,OpenGL DLL是如何调用图形函数的?C++中有一些隐藏的隐藏渲染代码吗?如果它可以从 DLL 调用 GPU,那么它应该可以在任何 C++ 程序中使用。如果是这样,我可以为我的程序制作一些自己的 API 吗?或者是什么?我希望这里有人知道。有人可以对这个主题有所了解吗?提前致谢!
4 回答
OpenGL DLL 像任何其他应用程序模块一样与 Ring 0 通信,调用如DeviceIoControl
. 传递给这些调用的数据的确切细节没有公开记录,而且不太可能改变。GPU 制造商只是不愿意随意放弃这些信息。虽然您可以创建自己的 API,但与驱动程序对话的详细信息并不容易获得。
首先也是最重要的:现代 OpenGL 不是一个库,在 Windows 上,DLL 不包含与硬件对话的 OpenGL 实现。opengl32.dll 仅充当占位符,驱动程序将其低级函数(称为 ICD)挂接到其中。
一般来说,答案是“是”,但要使其可行,必须在某种程度上“依赖硬件”
您在最底层称为“图形功能”(您认为 OGL 所基于的东西)取决于硬件将图像帧构造成自身并与处理器通信的方式。
有些硬件只是一个平面帧缓冲区,有些硬件能够自行管理矢量场景的光栅化过程。
有操作系统 API 是平面 2d 矢量和成像支持(如 GDI)甚至是三维建模系统(如 direc3d)。
OGL 只是一个 API:它定义了一组一致的函数原型来完成一项任务(描述一个 3D 场景)。renderimg 进程被实现到不同的 DLLS 中,这取决于它们必须使用的系统的性质。
其中一些只是在自己的缓冲区上操作,这些缓冲区将位图的原始数据视为通过 OS 本机 api 在屏幕上进行 Blit-ted(请参阅BitBlit),其他一些将 OGL 调用转换为对特定操作码的调用到特定 io-硬件设备的端口。
由于 OGL 的流行,也有制造商正在标准化库和设备之间的“语言”。所以事情并不像看起来那样“线性”......
直接写入硬件寄存器是在引入 OpenGL 和其他标准化图形 API 之前完成图形编程的方式。
一般来说,编写它是一场噩梦,几乎不可能调试。发明更高级别的 API 是有原因的。
如今,您最接近硬件的是在控制台上,您在控制台上的访问权限仍然比在 PC 上低得多,但即使是这种访问权限也比过去更加抽象。
如果你真的想这样做,你可以,但如果你不编写自己的操作系统,你基本上是在编写自己的驱动程序,而且你不会在现代 GPU 上找到很多公开可用的文档。