首页 > 解决方案 > 为什么在 OpenGL 上下文初始化后移动一些变量声明会破坏代码?

问题描述

我目前正在开发一个 Java 游戏,我在带有 LWJGL 2.9.3 的 AWT Canvas 中使用 OpenGL。而且我实际上不明白为什么在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 初始化中的方法调用。完整的代码来自这个答案。这个问题并不是很重要,但我想知道为什么仅仅替换几个声明就可以完全破坏游戏。

标签: javaopengllwjgl

解决方案


推荐阅读