4

所以当我掌握了java

paint(Graphics g){}

方法我继续创建自己的渲染方法,但我必须了解缓冲区策略以及如何“获取”图形

所以现在我正在学习openGL,我必须掌握这个方法:

@Override
public void display(GLAutoDrawable arg0){}

现在我想创建自己的渲染方法,到目前为止,我经常遇到一个异常:

线程“主”javax.media.opengl.GLException 中的异常:此线程上没有当前的 OpenGL 上下文

编辑:问题:如果我想在外部进行 glDraw 调用

@Override
public void display(GLAutoDrawable arg0){}

方法,如何确保我的 GLCanvas 的 glContext 是“当前的”

最好作为一个代码示例,因为我已经查看了 api 并广泛使用了谷歌,你们已经很友好地放在这里我以前已经找到的许多链接,我仍然在画一个空白......从字面上看!最接近我的是当它没有抛出“无当前上下文”异常但屏幕只是永久变黑!

4

3 回答 3

3

我在这里找到了讨论这个问题的文档:

http://fivedots.coe.psu.ac.th/~ad/jg2/ch15/index.html

GLContext.makeCurrent()/release() hack 似乎在 Linux/OpenJDK 6/JOGL 2 下对我有用,但我们会看到......特别是,使 OpenGL 上下文切换线程一直像那样会产生(也多少?)开销。

然后是 JOGL 2 的 NEWT 和 LWJGL 的工具包,但它们似乎是一个全新的蜡球,再见 Swing。:(

于 2011-09-17T13:45:53.717 回答
3

复制我对您其他问题的回答:

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

在幕后发生的事情是,当您创建的 GLCanvas 被绘制时,JOGL 在幕后正在做一大堆工作。它正在创建一个 GLContext,并使当前线程的 GLCanvas 成为当前线程。只有完成此操作后,您才能进行渲染调用。尚未成为当前的 GLContext 或从它派生的 GL 对象对您没有用处。

几乎所有的 JOGL 应用程序都以这种方式工作。您创建一个 GLEventListener,并在其中实现 display(),从 GLAutoDrawable 中提取一个 GL 并使用它来进行渲染调用。您不想在任何其他地方进行渲染调用,就像您不想在 paint() 方法之外进行 Graphics2D 调用一样。(您当然可以编写从 display() 方法调用的子方法,并将 GL 或 GLAutoDrawable 作为参数)。

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

如果您使用的是低级缓冲区,例如 BufferStrategy,最好的办法是将 JOGL 渲染到 GLPBuffer,这是一个离屏 JOGL 可绘制对象。创建 GLPBuffer,对其进行渲染,然后将渲染的位图复制到缓冲区中。GLDrawable 的一些实现允许使用“createOffscreenDrawable(...) 显式创建屏幕外可绘制对象。本文将为您提供一些指导。

如果您在渲染线程上,您也可以显式调用 GLDrawable.display()。

如果您希望进行初始化,例如创建显示列表,您可以使用 GLDrawable.init(...) 方法,该方法在第一次调用 display(...) 之前调用,尽管它可以调用更多不止一次。

于 2011-09-15T19:35:05.073 回答
0

不要问我为什么,但对我来说(经过这么多尝试)这就像一个魅力

我声明为变量

private GLCanvas gLCanvas;

然后只是一个

gLCanvas.repaint();

做的工作;)

于 2012-02-27T09:06:06.643 回答