当前位置:  开发笔记 > 运维 > 正文

为什么OpenGL的设计必须在运行时手动加载实际函数?

如何解决《为什么OpenGL的设计必须在运行时手动加载实际函数?》经验,为你挑选了1个好方法。

我只是阅读了加载OpenGL函数,并想知道为什么OpenGL的设计方式,而不是简单的方法,提供动态库和相应的标题?



1> Nicol Bolas..:

提供动态库和相应的标题?

然后你对"动态库"的工作原理产生了误解.

我们以Windows为例.在Windows上,如果你只有"动态库和相应的标题",你仍然无法加载该DLL并使用它.即使__declspec(dllimport)在标题中使用声明也是不够的.您还需要一件事:导入库.这是一个.lib有效地在加载DLL时为您加载函数指针的工作.

简而言之,它是语法糖:很高兴,但不是必需的.很像OpenGL加载库.

在Linux上,事情有点不同.SO文件更自包含; 它们基本上存储了相应的导入库.所以,在理论上你可以通过"动态库和相应的标题"来实现.

即便如此,它仍然是糖; 您可以动态加载它们并根据需要手动获取函数指针.

理论上所有这些糖都可以与OpenGL一起使用.但让我们考虑一下这种情况的后果.

在Windows上,导入库静态链接到您的应用程序.因此,它必须工作; 如果它找不到DLL,或者DLL没有提供它应该的功能,那么你的程序就无法运行.完全没有.这就是大多数"丢失DLL"错误的原因; 一些静态导入库试图找到一个不存在的DLL.

那么......如果我想编写一个至少使用OpenGL 3.3的应用程序,但是如果它们存在则能够使用OpenGL 4.5的功能呢?我无法链接到OpenGL 4.5导入库,因为它无法加载amy 3.3实现.所以我必须链接到OpenGL 3.3的导入库.但是,我如何访问4.5功能?没错:如果存在,我必须加载函数指针.

所以大多数人无论如何都要加载一些功能.加载整个东西要干得多.这样,您就不必拥有版本化的导入库.

此外,通过动态加载所有OpenGL函数,您无需等待操作系统供应商更新其DLL,然后才能使用下一组OpenGL函数.主DLL只提供与实际实现OpenGL的IHV驱动程序DLL(或Linux上的开源驱动程序)的连接.

请注意,Microsoft的OpenGL32.dll仍然只提供OpenGL 1.1.所以我说我们没有等他们就受益了;)

此外,我们有"简单的方法":使用OpenGL加载库.


Windows中还存在多个可安装的客户端驱动程序的问题。与GLX不同,WGL返回的扩展功能将根据上下文所运行的实现而有所不同(实际上,您甚至可以在没有上下文之前在GLX中获取扩展地址)。架构上的差异太多,无法以“简便的方式”进行操作。
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有