我已经使用 GLAD 和 SFML 一段时间了,并且我一直在使用 GLAD 的内置函数加载器,
gladLoadGL
,它对我来说效果很好。现在我正在查看 GLFW,它在他们的指南和 Khronos opengl wiki 上都说你应该使用 gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)
来代替。有什么特别的原因吗
有什么特别的原因吗?
将
gladLoadGL
与 GLFW 等结合使用会导致同一程序中的两个代码部分基本上执行相同的操作,但没有任何好处。
例如,查看 GLFW 在 Windows 上的作用(在其他平台上类似):
_glfw.wgl.instance = LoadLibraryA("opengl32.dll");
它会在您背后动态加载 GL 库。它提供了用于查询 OpenGL 函数指针的抽象(核心函数指针和扩展函数指针,使用
wglGetProcAddress
和原始 GetProcAdress
)。
GL 加载器很高兴生成做同样的事情:
libGL = LoadLibraryW(L"opengl32.dll");
现在有人可能会说,加载同一个共享库两次并不是什么大问题,因为这应该会导致重复使用相同的内部句柄,并通过引用计数来处理,但即便如此,这只是不必要的代码,而且它在初始化过程中仍然会消耗内存和一些时间。
因此,除非您有一些非常具体的原因为什么需要glad的代码 - 也许以修改后的形式来真正做其他事情(例如使用不同的GL库,然后是您的系统默认使用的库),否则没有用这段代码的情况 - 不包含不需要的代码似乎是一个合理的建议。
作为旁注:我经常看到使用 GLFW 和 GL 加载器的项目,例如 GLAD 或 GLEW 在链接时链接
opengl32.lib
或 libGL.so
- 这也绝对没有必要,因为代码始终会在运行时手动加载库,并且在链接时不应该留下任何链接器可以从 GL 库解析的 GL 符号。