Java:openGL:JOGL:当我调用display()方法时,幕后会发生什么?

Tro*_*eph 5 java opengl jogl

我有这行代码:

renderableObject.renderObject(gl, glu);
Run Code Online (Sandbox Code Playgroud)

这会导致openGL呈现大量对象,但只有在使用时才能使用:

@Override
public void display(GLAutoDrawable drawable)
    {               
        renderableObject.renderObject(gl, glu);
    }
Run Code Online (Sandbox Code Playgroud)

如果我在重写的显示方法之外调用该行,我得到一个异常,说当前线程上没有glContext,实际上如果我在这个方法之外调用任何gl draw命令,我得到相同的异常

理想情况下,我想创建一个显示列表一次,然后使用奇数显示列表每帧渲染它们以定期重新创建.但是我必须通过这个单一的display()方法,这意味着如果显示列表已经创建,或者需要更改等,我必须测试每一帧...每秒60次!当我需要时可以单独处理它们时会浪费处理能力.

所以无论调用display()方法做什么,我都希望能够复制它,这样我就可以创建大量自己的自定义显示方法,而无需通过这一方法来实现一切!

那么我可以做一个简单的电话吗?

DJC*_*rth 2

尽管看起来很奇怪,但这就是它应该的工作方式。

在幕后发生的事情是,当您创建的 GLCanvas 被绘制时,JOGL 在幕后正在做一大堆工作。它正在创建一个 GLContext,并使其成为当前线程的 GLCanvas 的当前上下文。只有完成此操作后,您才能进行渲染调用。尚未成为当前状态的 GLContext 或从其派生的 GL 对象对您来说没有用处。此外,GLContext仅针对该线程设为当前设为当前,并且在显示调用完成后立即设为非当前,因此保留对其或 GL 的引用以供以后使用将不起作用。

几乎所有 JOGL 应用程序都以这种方式工作。您创建一个 GLEventListener,并在其中实现 display(),从 GLAutoDrawable 中提取 GL 并使用它来进行渲染调用。您不想在任何其他地方进行渲染调用,就像您不想在 Paint() 方法之外进行 Graphics2D 调用一样。大多数 Java 初学者都会尝试从 Paint 方法之外进行绘制;这很相似。如果您需要触发重绘,那么您可以像使用 Java2D 一样进行操作:使用 invalidate()。(当然,您可以编写从 display() 方法调用的子方法,并将 GL 或 GLAutoDrawable 作为参数)。

您可以通过多种方法专门创建 GLContext 并使其成为当前的当前上下文,但很少有必要。使用这里的方法几乎总是更好。