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

标签 java opengl jogl

我有这行代码:

renderableObject.renderObject(gl, glu);

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

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

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

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

因此,无论调用 display() 方法做什么,我都希望能够复制它,从而允许我创建大量我自己的自定义显示方法,而无需对所有内容都使用这种方法!

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

最佳答案

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

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

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

您可以通过多种方式专门创建一个 GLContext 并使其成为最新的,但它们很少是必需的。使用此处的方法几乎总是更好。

关于Java:openGL:JOGL:当我调用 display() 方法时,幕后发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7414841/

相关文章:

scala - 在 Scala 中重现 Java OpenGL ES 2.0 演示时出现奇怪的 NullPointerException

java - JOGL 物理(Java、OpenGL)

java - 相机旋转

java - 如何在 JFrame 窗口中移动 Sprite (图像)?

c++ - opengl c++ 中的 180 到 -180 运动?

c++ - 是否可以在一个 OpenGL 矩阵中翻译两次?

c++ - 将子部件添加到 Qt 中的另一个部件

java - CriteriaBuilder 没有方法 createCriteriaUpdate

java - Elastic APM Tomcat zip 文件或 JAR list 丢失

java - 获取已安装在 OSGi 运行时中的 bundle 的 InputStream?