我正在尝试在使用 GLFW 和 GLAD 的应用程序中为 OpenGL 驱动程序构建一个后备机制,如果系统提供的库不支持 4.5 版本,则会使用 Mesa 实现。
将系统 OpenGL 库命名为
opengl32.dll
,将 Mesa 命名为 opengl32_mesa.dll
。
我相信 GLFW 通过标准系统名称
opengl32.dll
加载到 OpenGL 驱动程序库中。我可以通过使用 LoadLibrary*
函数来选择正确的实现,但库名称不同。如果我加载 opengl32_mesa.dll
,那么它不会被 GLFW 拾取,因为它与它期望的名称不匹配,即 opengl32.dll
。
那么,是否可以以不同的名称加载库来实现这一点?
要在系统库不支持 OpenGL 4.5 版本的情况下实现使用 Mesa 实现的回退机制,您可以在初始化 GLFW 之前手动加载适当的 OpenGL 库。为此,您可以使用 Windows LoadLibrary 函数加载 Mesa 库,然后将 GLFW 调用重定向到此加载的库。
这里有一个可能的解决方案: 手动加载库:在初始化GLFW之前,使用LoadLibrary加载opengl32_mesa.dll库。 重定向调用:您可以使用 wglGetProcAddress 函数从库中获取手动加载的 OpenGL 函数的地址。 以下是如何在 C++ 中实现此功能的示例:
#include <windows.h>
#include <GLFW/glfw3.h>
#include <iostream>
// Function to load the OpenGL library
HMODULE openglLibrary = NULL;
// Function to load the OpenGL library
bool LoadOpenGLLibrary(const char* libraryName) {
openglLibrary = LoadLibrary(libraryName);
return openglLibrary != NULL;
}
// Function to get the address of an OpenGL function
void* GetOpenGLFunction(const char* name) {
void* p = (void*)wglGetProcAddress(name);
if (p == NULL || p == (void*)0x1 || p == (void*)0x2 || p == (void*)0x3 || p == (void*)-1) {
p = (void*)GetProcAddress(openglLibrary, name);
}
return p;
}
int main() {
// Attempt to load the system's OpenGL library
if (!LoadOpenGLLibrary("opengl32.dll")) {
std::cerr << "Failed to load system OpenGL library." << std::endl;
return -1;
}
// Check OpenGL version
// Here you can add your code to check the OpenGL version
// If the version is not the desired one, load the Mesa library
if (!LoadOpenGLLibrary("opengl32_mesa.dll")) {
std::cerr << "Could not load Mesa library." << std::endl;
return -1;
}
// Init GLFW
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW." << std::endl;
return -1;
}
// Create a GLFW window
GLFWwindow* window = glfwCreateWindow(640, 480, "Window GLFW", NULL, NULL);
if (!window) {
std::cerr << "Failed to create GLFW window." << std::endl;
glfwTerminate();
return -1;
}
// Make the current context
glfwMakeContextCurrent(window);
// Load OpenGL functions using gladLoadGLLoader and our function GetOpenGLFunction
if (!gladLoadGLLoader((GLADloadproc)GetOpenGLFunction)) {
std::cerr << "Failed to load OpenGL functions." << std::endl;
return -1;
}
// // Main cycle
while (!glfwWindowShouldClose(window)) {
// Render here
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
}
// Clear
glfwDestroyWindow(window);
glfwTerminate();
if (openglLibrary) {
FreeLibrary(openglLibrary);
}
return 0;
}
在这段代码中,我们首先尝试加载系统OpenGL库(opengl32.dll)。如果 OpenGL 版本不是所需的版本,我们会尝试加载 Mesa 库 (opengl32_mesa.dll)。然后,我们初始化 GLFW 并使用 happyLoadGLLoader 来使用 GetOpenGLFunction 函数加载 OpenGL 函数,该函数从加载的库中获取函数地址。
如果系统 OpenGL 库不支持所需的版本,此方法应该允许您使用 Mesa 实现。