加载同名下的不同OpenGL后端库

问题描述 投票:0回答:1

我正在尝试在使用 GLFW 和 GLAD 的应用程序中为 OpenGL 驱动程序构建一个后备机制,如果系统提供的库不支持 4.5 版本,则会使用 Mesa 实现。

将系统 OpenGL 库命名为

opengl32.dll
,将 Mesa 命名为
opengl32_mesa.dll

我相信 GLFW 通过标准系统名称

opengl32.dll
加载到 OpenGL 驱动程序库中。我可以通过使用
LoadLibrary*
函数来选择正确的实现,但库名称不同。如果我加载
opengl32_mesa.dll
,那么它不会被 GLFW 拾取,因为它与它期望的名称不匹配,即
opengl32.dll

那么,是否可以以不同的名称加载库来实现这一点?

winapi opengl dll
1个回答
0
投票

要在系统库不支持 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 实现。

© www.soinside.com 2019 - 2024. All rights reserved.