0

我目前正在编写一个使用 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 方法。

4

1 回答 1

3

GL 上下文通常在窗口第一次可见时创建,但它是特定于平台的 - 可能是创建窗口时,也可能是在程序开始绘制之前。init() 方法将在第一次 display() 之前被调用,但同样不能保证确切的发生时间。

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

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

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

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

于 2021-05-01T11:23:08.157 回答