我现在正在学习OpenGL,并在其上编写一些几何抽象供个人使用。我希望我的代码具有最大的可移植性,并且希望在调用者代码中初始化GL上下文(通过FLTK,wxWidgets,WinAPI或任何其他受支持的平台)。
我正在阅读这篇热门文章:https://learnopengl.com/Getting-started/Creating-a-window
作者建议在那里使用GLAD库,因为该库提供了GL上下文的创建(不适合我),并且还用于“检索函数的地址”(引用:“由于OpenGL有许多不同版本,驱动程序,其大多数功能的位置在编译时未知,需要在运行时查询。”
我的问题如下:
编译器真的不能从我在Visual Studio的链接器设置中指定的GL相关.obj文件中获取Opengl函数的地址吗?我真的需要使用wglGetProcAddress
例程来引用OpenGL函数吗?是否可以像链接头文件和.obj文件中的其他任何函数一样使用OpenGL函数?
答案 0 :(得分:3)
作者建议在那里使用GLAD库,因为该库提供了GL上下文的创建(不适合我)
否,GLAD不会以任何方式创建或管理GL上下文,并且网站https://learnopengl.com/Getting-started/Creating-a-window从未对此声明。他们使用GLFW进行上下文和窗口管理。
编译器真的不能从我在Visual Studio的链接器设置中指定的GL相关.obj文件中获取Opengl函数的地址吗?
否
首先,您没有为链接器指定与OpenGL相关的.obj
文件,但是在Windows上,您可以使用opengl32.lib
,它是opengl32.dll
的导入库文件, Windows 95以后的每个Windows版本都附带该版本。
但是,此DLL不包含您通常使用的OpenGL实现,但包含Microsoft的OpenGL 1.1 GDI软件光栅化器。 Windows上的实际OpenGL实现由图形驱动程序随附的可安装客户端驱动程序(ICD)提供。对于OpenGL 1.0和1.1函数,opengl32.dll
将充当trampoline,并将调用转发到实际的ICD DLL。
如果要调用OpenGL 1.1以外的任何OpenGL函数(并且该函数来自1997年),则必须在每种情况下都使用OpenGL扩展机制,例如 {{1} }根本不提供这些入口点,并且编译器/链接器当然不会找到它们。