如何创建自己的openGL上下文并将其绑定到GLCanvas?

时间:2011-09-14 16:53:04

标签: opengl jogl openglcontext

所以当我掌握java

paint(Graphics g){}

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

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

@Override
public void display(GLAutoDrawable arg0){}

现在我想创建自己的渲染方法,到目前为止我一直遇到一个例外:

  

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

编辑:问题:如果我想在

之外进行glDraw调用
@Override
public void display(GLAutoDrawable arg0){}

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

最好作为一个代码示例,正如我已经浏览了api并使用谷歌扩展,许多链接你们已经非常友好地放在这里我已经找到了之前我仍然画了一个空白...字面意思!我得到的最近的是,当它没有抛出“没有当前上下文”的例外情况时,屏幕只是永远变黑了!

3 个答案:

答案 0 :(得分: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(...)显式创建屏幕外可绘制。This article will give you some pointers.

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

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

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

我宣布为变量

private GLCanvas gLCanvas;

然后只是一个

gLCanvas.repaint();

做了这个工作;)