我正在用 Java 创建一个应用程序,其中有两个窗口,一个“游戏视图”窗口和一个带有调试选项的 Swing 窗口。 Swing 窗口中包含游戏的另一个视图,我可以在其中飞行调试相机。
我正在创建“游戏窗口”,
...
window = glfwCreateWindow(300, 300, "Game", NULL, NULL);
...
在 Swing 部分,我使用 https://github.com/LWJGLX/lwjgl3-awt 作为我可以绘制的画布。 我正在创建它,
frame.add(canvas = new AWTGLCanvas(new GLData()) {
public void initGL() {
…
}
public void paintGL() {
…
}
});
如何在两者之间共享上下文,以便我可以使用相同的纹理、VBO 等?
AWTGLCanvas 提供了一种传入另一个 AWTGLCanvas 的方法,通过您传递给
GLData#shareContext
构造函数的 GLData
实例上的 AWTGLCanvas
字段来共享其上下文。 GLData#shareContext
需要另一个AWTGLCanvas
实例,我无法获得它,因为另一个窗口是用GLFW
制作的。
我尝试将上下文从
AWTGLCanvas
传递到 glfwCreateWindow
作为 share
参数,但这会导致本机代码崩溃。
深入研究
AWTGLCanvas
的来源后,它使用 WGL#wglShareLists
来共享上下文。 在 GLFW
中创建窗口后直接调用自己是行不通的,该方法返回 false,根据文档指示错误。
重申我的问题,如何在“正常”LWJGL 窗口和 Swing 之间共享上下文。
如果需要,我愿意使用不同的库在 Swing 画布上绘图。
我弄清楚如何解决问题。 我在渲染到 GLFW 窗口之前调用它。
long hwnd = GLFWNativeWin32.glfwGetWin32Window(glfwWindowHandle);
long hdc = User32.GetDC(hwnd);
WGL.wglMakeCurrent(hdc, awtglCanvasContext);
GLFW 窗口现在使用与 AWTGL Canvas 相同的上下文。