Есть ли способ использовать более одного контекста 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 уже стабилен, я рекомендую вам использовать новую версию.

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