我可以使用我称之为"Raw OpenGL"的东西吗?
Can I use what I'd call "Raw OpenGL"?
我想知道关于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的公开可用文档。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- 我可以使用我称之为"Raw OpenGL"的东西吗?