【问题标题】:Java: openGL: JOGL: What happens behind the scenes when I call the display() method?Java: openGL: JOGL: 当我调用 display() 方法时,幕后会发生什么?
【发布时间】:2011-09-14 10:31:24
【问题描述】:

我有这行代码:

renderableObject.renderObject(gl, glu);

这会导致 openGL 渲染大量对象,但它仅在如下使用时才有效:

@Override
public void display(GLAutoDrawable drawable)
    {               
        renderableObject.renderObject(gl, glu);
    }

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

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

所以无论调用 display() 方法做什么,我都希望能够复制它,允许我创建大量我自己的自定义显示方法,而无需通过这个方法来处理所有事情!

那么我可以自己做一个简单的 gl 调用吗?

【问题讨论】:

    标签: java opengl jogl


    【解决方案1】:

    虽然看起来很奇怪,但它应该是这样工作的。

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

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

    您可以通过多种方式专门创建一个 GLContext 并自行使其成为当前版本,但它们很少需要。在这里使用这种方法几乎总是更好。

    【讨论】:

    • JOGL 在幕后做了大量工作。它正在创建一个 GLContext,并使当前线程的 GLCanvas 成为当前线程。 --------我不能自己做吗?
    • 塞巴斯蒂安·特洛伊,你可以,但它所做的并不是微不足道的。您可以执行严格的最小操作(从 GLAutoDrawable 获取 GLContext 并使其成为最新的),但请记住,JOGL 包含大量不错的怪癖和变通方法,它们比 C 中的原生普通 OpenGL 或 Java 中的其他绑定更安全, C#, Python, ... 而且,如果你做的不好,很容易毁掉你的表现。当我将 Ardor3D 移植到 JOGL 2 时,我发现 makeCurrent() 被无用地调用了一次,当 v-sync 关闭时,删除这个调用给了我巨大的提升。
    猜你喜欢
    • 2010-11-20
    • 2013-04-18
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多