Есть ли способ использовать более одного контекста LWJGL
Я пытаюсь показать два дисплея одновременно, используя нити и показывая их на 2 разных холстах.
Статистика программного обеспечения:
- Название ОС Linux
- Версия ОС 3.16.0-34-generic
- LWJGL версия 2.9.3
- OpenGL версия 3.3 (основной профиль) Mesa 10.1.3
Код из моего класса GUI, который я пытаюсь запустить:
public UIMain2() {
initComponents();
canvas1 = new Canvas();
canvas1.setSize(700, 350);
canvas1.setBackground(Color.WHITE);
canvas1.isDisplayable();
canvas1.setVisible(true);
jPanel2.add(canvas1);
dt1 = new DisplayThread(canvas1);
dt1.start();
canvas2 = new Canvas();
canvas2.setSize(700, 350);
canvas2.setBackground(Color.WHITE);
canvas2.isDisplayable();
canvas2.setVisible(true);
jPanel3.add(canvas2);
dt2 = new DisplayThread(canvas2);
dt2.start();
}
Пример кода моей темы Класс:
public class DisplayThread extends Thread {
Canvas canvas;
String modelString = "";
Player player;
Camera camera;
DisplayManager m;
public DisplayThread(Canvas canvas) {
this.canvas = canvas;
}
public void run() {
m = new DisplayManager();
m.createDisplayJFrame(canvas);
...
}
...
}
Пример кода моего класса DisplayManager:
public class DisplayManager {
private static final int WIDTH = 700;
private static final int HEIGHT = 350;
private static final int FPS_CAP = 120;
private static long lastFrameTime;
private static float delta;
//Display d = new Display();
public void createDisplayJFrame(Canvas canvas) {
ContextAttribs attribs = new ContextAttribs(3, 2)
.withForwardCompatible(true).withProfileCore(true);
try {
Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
Display.setParent(canvas);
Display.create(new PixelFormat(), attribs);
Display.setTitle("Potato");
} catch (LWJGLException ex) {
}
GL11.glViewport(0, 0, WIDTH, HEIGHT);
}
...
}
Я получаю ошибку: "В каждый момент может быть создан только один контекст LWJGL"
Есть ли способ обойти это, чтобы отобразить дисплей, который создает каждый поток? На данный момент только один холст показывает дисплей.
1 ответ
LWJGL2 допускает только одно отображение, доступ к которому осуществляется статическими методами в Display
учебный класс. Если вы хотите использовать несколько дисплеев, вам придется перейти на версию 3, где GLFW дает вам лучший контроль над вашими окнами.
Однако в качестве обходного пути можно использовать дисплей LWJGL и JFrame с Canvas. Затем вы можете выполнить рендеринг в кадровый буфер, получить данные пикселей с помощью glGetTexImage и отобразить их на холсте.
Но поскольку это не будет иметь хорошую производительность, а LWJGL3 уже стабилен, я рекомендую вам использовать новую версию.