LWJGL 3 在 Swing 和 GLFW 窗口之间共享上下文

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

我正在用 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 画布上绘图。

java swing opengl lwjgl
1个回答
0
投票

我弄清楚如何解决问题。 我在渲染到 GLFW 窗口之前调用它。

long hwnd = GLFWNativeWin32.glfwGetWin32Window(glfwWindowHandle);
long hdc = User32.GetDC(hwnd);
WGL.wglMakeCurrent(hdc, awtglCanvasContext);

GLFW 窗口现在使用与 AWTGL Canvas 相同的上下文。

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