【问题标题】:How to retrieve a GL2 instance?如何检索 GL2 实例?
【发布时间】:2021-07-24 04:23:46
【问题描述】:

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

【问题讨论】:

  • GLEventListener.init(GLAutoDrawable) 是这样做的正确位置,有什么问题?您看过我们在 wiki 中的示例吗?
  • 我不知道组件的数量(组件可以在游戏循环期间添加或删除),我无法在 GLEventListener.init(GLAutoDrawable) 中为所有组件分配.无论如何,我会看看 wiki,谢谢。
  • 在 jogl wiki 上找到,jogl 示例的链接以色情视频 url 为目标...你能分享你所说的例子吗,这对我有帮助!
  • 我们的 wiki 中没有此类内容,您可能会将其与未在我们网站上托管的内容混淆。我建议你看看这个:jogamp.org/wiki/index.php?title=Jogl_Tutorial

标签: java opengl jogl openglcontext


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 这是一个很好的建议。我在我们的官方论坛上多次解释了当 OpenGL 不是最新的或者它在另一个线程上是当前的或者同时它已经失效时操纵 GL 实例的风险。
  • 那么让每个组件都实现 GLEventListener 是不是更好的选择?
  • 不确定您所说的组件是什么意思。 GL 上下文通常是为窗口创建的,负责管理所有屏幕上和屏幕外的帧缓冲区、纹理等。 (请注意,创建上下文不是 OpenGL API 本身的一部分,它在不同的操作系统上是不同的。)通常有一种方法可以在上下文之间共享几何体/纹理等,但是您可以只用一个窗口做很多好的 3D和一个上下文。
  • 对不起,我的回答很糟糕,我认为这篇文章让我失望了。我说的组件是游戏中的实体,或者如果您愿意,可以说是游戏对象。如果我有最后一个问题,那就是:我在哪里分配 vao(不在 GLEventListener.init 但它需要一个 gl 实例)?
  • 我终于解决了这个问题。我不得不在 glfwMakeContextCurrent(window); 之后移动 GL11.glViewport(0, 0, videoMode.width(), videoMode.height()); 非常感谢你们两个,分享你们的建议和知识,你们太有用了
猜你喜欢
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多