如何在可执行文件和 DLL 之间使用 OpenGL 函数指针?

How to use OpenGL function pointers between an executable and DLL?

我正在尝试用 Rust 制作一个基于插件的游戏,但我遇到了一些困难。我制作插件的方式是通过 上共享的方法。在 运行 的时候,我将从插件中动态加载所有必要的功能,并在需要时 运行 稍后 运行.
我的问题是使用 OpenGL 通过其中一个插件的代码将内容绘制到屏幕上。在我游戏的可执行文件中,我从插件 (目前只有一个函数) 加载所有函数,创建 GLFW window 并加载 OpenGL 函数指针,代码如下所示, 来自 here.

gl::load_with(|symbol| window.get_proc_address(symbol) as *const _);

在游戏循环中,我从插件中调用加载函数,drawvao

while !window.should_close() {
process_events(&mut window, &events);

unsafe {
gl::ClearColor(0.2, 0.3, 0.3, 1.0);
gl::Clear(gl::COLOR_BUFFER_BIT);
             
drawvao(shaderProgram, VAO);
}

window.swap_buffers();
glfw.poll_events();
}

pub extern "C" fn drawvao(shaderProgram: u32, Vao: u32){
gl::UseProgram(shaderProgram);
gl::BindVertexArray(VAO);
gl::DrawArrays(gl::TRIANGLES, 0, 3);
}

drawvao中的代码失败,说找不到OpenGL函数指针。

我如何做到这一点,而不是在每个插件中再次加载函数指针?

我想过制作一个中间板条箱,叫做 api ,它们都有作为一个依赖项,但它仍然会加载到每个插件的函数指针中,我不确定它们是否会绘制到 GLFW window。
我也考虑过在插件和游戏中从外部 DLL 加载函数指针,但我不知道这是否有帮助。我知道该解决方案可以在 .NET 语言中使用,但是,除非我弄错了,否则它在 Rust 中的工作方式不同。

while not loading the function pointers in again in each plugin?

你不能。除非您正在使用的可执行文件导出所有这些 OpenGL 函数指针,或者您正在导入导出这些函数指针的通用 DLL。

每个 DLL 和可执行文件都是不同的,并且在大多数情况下完全独立于其他可执行文件。除非他们明确地分享某些东西,否则它不会被分享。而且大多数程序不会明确共享它们的 OpenGL 函数指针,因此您必须自己加载它们。