我一直在玩 Derelict3&glfw 根据 this 在 D 中使用 OpenGL ,如果我想使用扩展,我需要首先创建一个上下文,这是通过使用 glfw 创建一个窗口并将其设置为当前上下文来完成的。创建并设置上下文后,我需要使用 DerelictGL3.reload()
加载所有扩展。
现在,我想在创建窗口之前做好所有准备工作。这些准备工作之一是加载并编译所有着色器程序。但这需要着色器扩展,它需要 Derelict3GL.reload()
,它拒绝在没有上下文的情况下运行...
所以,我使用了这个黑客:
auto tmpWindow=glfwCreateWindow(1,1,"",null,null);
glfwMakeContextCurrent(tmpWindow);
DerelictGL3.reload();
glfwDestroyWindow(tmpWindow);
这有效 - 我现在可以加载并编译着色器程序然后打开真实的窗口。但这对我来说似乎有点太老套了。是否有正确的方法来伪造上下文,或者在没有上下文的情况下加载扩展?
最佳答案
Is there a proper way to fake a context, or to load the extensions without a context?
这取决于平台:
对于 Windows:通过中间窗口(不必在屏幕上可见地映射)执行此操作是在 Windows 上可靠加载扩展的唯一方法。
对于 X11/GLX:可以使用 glXGetProcAddress 立即加载扩展函数指针,并且扩展函数是 GLX 客户端库的一部分,并且对所有上下文都是通用的。然而,实际的 OpenGL 上下文可能不支持可以通过 glXProcAddress 有效获取的所有函数。
关于opengl - 创建一个假的 OpenGL 上下文以加载扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328025/