Почему перемещение некоторых переменных после инициализации контекста OpenGL нарушило код? - PullRequest
4 голосов
/ 24 марта 2019

В настоящее время я работаю над Java-игрой и использую OpenGL в AWT Canvas с LWJGL 2.9.3.И я на самом деле не понимаю, почему перемещение некоторых объявлений объектов после Display.create() заставляет холст перестать показывать что-либо (glClearColor все еще работает).

Вот код, который работает:

  private void startGL() {
    glThread = new Thread(() -> {
      isRunning = true;

      ArrayList<Entity> entities = new ArrayList<>();
      Vector3f lightPosition = new Vector3f(-20.0f, 20.0f, -20.0f);
      Matrix4f projMatrix = new Matrix4f();
      Camera camera;
      EntityRenderer entityRenderer = null;

      try {
        Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight));
        Display.create();
      } catch (LWJGLException e) {
        e.printStackTrace();
      }

      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
      glCullFace(GL_BACK);

      camera = new Camera();
      try {
        entityRenderer = new EntityRenderer();
      } catch (IOException e) {
        e.printStackTrace();
      }
      projMatrix.setPerspective((float) Math.toRadians(45.0f), dmGetAspectRatio(), 0.1f, 1000f);

      while(isRunning) {
         //rendering and update code
      }

      //cleanup code
    }, "LWJGL Thread");

    glThread.start();
  }

А вот код, который не работает:

  private void startGL() {
    glThread = new Thread(() -> {
      isRunning = true;

      try {
        Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight));
        Display.create();
      } catch (LWJGLException e) {
        e.printStackTrace();
      }

      ArrayList<Entity> entities = new ArrayList<>();
      Vector3f lightPosition = new Vector3f(-20.0f, 20.0f, -20.0f);
      Matrix4f projMatrix = new Matrix4f();
      Camera camera;
      EntityRenderer entityRenderer = null;

      glEnable(GL_DEPTH_TEST);
      glEnable(GL_CULL_FACE);
      glCullFace(GL_BACK);

      camera = new Camera();
      try {
        entityRenderer = new EntityRenderer();
      } catch (IOException e) {
        e.printStackTrace();
      }
      projMatrix.setPerspective((float) Math.toRadians(45.0f), dmGetAspectRatio(), 0.1f, 1000f);

      while(isRunning) {
         //rendering and update code
      }

      //cleanup code
    }, "LWJGL Thread");

    glThread.start();
  }

Эти методы вызываются методом addNotify() при инициализации Canvas.Полный код от этого ответа .Эта проблема не очень важна, но я хотел бы знать, почему просто смещение нескольких объявлений может полностью сломать игру.

...