如何检索 GL2 实例?

How to retrieve a GL2 instance?

我目前正在编写一个带有 JOGL 绑定的游戏以使用 OpenGL,但我在这方面苦苦挣扎。

我需要使用我在实现 GLEventListener 的 class 的 init 方法中收集的 GL2 变量来初始化我的 vaos 和 vbos(针对每个组件)。像这样,

public abstract class Scene implements GLEventListener {
    private GL2 gl;

    @Override
    public void init(GLAutoDrawable drawable) {
        gl = drawable.getGL().getGL2();
        ...

但是当我想使用它时这个变量是空的,因为它出现在调用方法 init 之前(这对我来说很奇怪)。我还检查了 GLContext.getCurrent() 以检索 GL 实例,但上下文也为空。

所以我想知道上下文是在哪里创建的,是什么触发了上面的init函数?

也许我可以简单地创建一个布尔值来告知组件何时在我的渲染函数中初始化,因此可能会调用 GL init 方法。

GL 上下文通常在 window 第一次可见时创建,但它是特定于平台的 - 可能是在创建 window 时,也可能是在程序启动之前画画。 init() 方法将在第一个 display() 之前被调用,但同样无法保证确切发生这种情况的时间。

我对 JOGL 的建议是不要永久存储 GL 上下文。相反,每个 init()、display()、reshape() 都以

开头
GL2 gl = drawable.getGL().getGL2();

在某些平台上,尝试在其中一种方法之外使用 GL 上下文不会 work/crashes 程序,因此将上下文设为本地也会阻止您编写可以这样做的代码。

如果用户说将 window 移动到由不同 GPU 控制的显示器上,上下文也可能会发生变化。