Я создаю приложение на 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.
Да, я забыл после этого опубликовать анонимный класс. Я обновлю вопрос
Я думаю, именно здесь вам нужно внести изменения, чтобы поделиться контекстом. createContext вызывается перед рендерингом, если контекст равен 0L. Возможно, вы сможете воспользоваться этим методом и выяснить, что вам нужно предоставить, чтобы создать общий контекст. Или ваш метод initGL() должен будет выполнить настройку холста, но с использованием предоставленного контекста.
Я придумываю, как решить проблему. Я вызываю это прямо перед рендерингом в окне GLFW.
long hwnd = GLFWNativeWin32.glfwGetWin32Window(glfwWindowHandle);
long hdc = User32.GetDC(hwnd);
WGL.wglMakeCurrent(hdc, awtglCanvasContext);
Окно GLFW теперь использует тот же контекст, что и холст AWTGL.
Разве AWTGLCanvas не абстрактен?