LWJGL 3 совместно использует контекст между окнами Swing и GLFW

Я создаю приложение на 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.

Разве AWTGLCanvas не абстрактен?

matt 01.08.2024 15:54

Да, я забыл после этого опубликовать анонимный класс. Я обновлю вопрос

PjRock 01.08.2024 16:04

Я думаю, именно здесь вам нужно внести изменения, чтобы поделиться контекстом. createContext вызывается перед рендерингом, если контекст равен 0L. Возможно, вы сможете воспользоваться этим методом и выяснить, что вам нужно предоставить, чтобы создать общий контекст. Или ваш метод initGL() должен будет выполнить настройку холста, но с использованием предоставленного контекста.

matt 01.08.2024 16:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я придумываю, как решить проблему. Я вызываю это прямо перед рендерингом в окне GLFW.

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

Окно GLFW теперь использует тот же контекст, что и холст AWTGL.

Другие вопросы по теме