如何检索 GL2 实例?

问题描述

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

我需要使用我在实现 GLEventListener 的类的 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 上下文通常在窗口第一次可见时创建,但它是特定于平台的 - 可能是在创建窗口时,也可能是在您的程序开始绘制之前。 init() 方法将在第一个 display() 之前被调用,但同样无法保证确切发生这种情况的时间。

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

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

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

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