如何在 JOGL 中静态使用 GL 对象?
How to use the GL-Object statically in JOGL?
我正在尝试使用 JOGL 制作一个简单的游戏引擎。但是我不想使用 EventListener Class,而是想像在 LWJGL 中那样创建一个静态对象。不,我不使用 LWJGL,因为我遇到了很多麻烦。
这是我的事件监听器:
class EventListener implements GLEventListener {
public static GL2 gl;
@Override
public void display(GLAutoDrawable drawable) {
gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glClearColor(0, 1, 0, 1);
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
}
}
在主要 class 中,它清除了绿屏,因此可以完美运行。
但是,如果我尝试在另一个 class 中使用 'gl' 对象,它什么也不做。提前致谢!
实际上,这是个坏主意。您不得将 GL 实例存储到字段中,因为它很容易出错,原因如下:
- GL实例随时可能失效
- 您可以在没有 OpenGL 上下文的线程上访问它
当前
- 您可以在 OpenGL 上下文已成为当前线程的线程上访问它,但有时它不是当前的(在 OpenGL 上下文发布后)
上下文)
这就是您应该使用 GLEventListener 的原因。否则,您也可以通过调用 GLContext.getCurrentGL() but it throws a GLException if no context is current. You can use GLAutoDrawable.invoke() 获得有效的 GL 实例,它允许 运行 您的代码在正确的时间在正确的线程上运行,但 GLEventListener 更有用,因为您可以在初始化时执行一些代码.
顺便说一句,JOGL 的具体问题应该在 the official JogAmp forum 而不是这里提出。 Whosebug 是解决一般 OpenGL 问题的好地方,但大多数 JogAmp 贡献者从来没有来过这里。是的,Whosebug 不是灵丹妙药。
P.S:如果你想了解JOGL的设计选择,尤其是实例设计,我建议你阅读this article and this comment。
我正在尝试使用 JOGL 制作一个简单的游戏引擎。但是我不想使用 EventListener Class,而是想像在 LWJGL 中那样创建一个静态对象。不,我不使用 LWJGL,因为我遇到了很多麻烦。 这是我的事件监听器:
class EventListener implements GLEventListener {
public static GL2 gl;
@Override
public void display(GLAutoDrawable drawable) {
gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glClearColor(0, 1, 0, 1);
}
@Override
public void dispose(GLAutoDrawable drawable) {
}
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
}
}
在主要 class 中,它清除了绿屏,因此可以完美运行。 但是,如果我尝试在另一个 class 中使用 'gl' 对象,它什么也不做。提前致谢!
实际上,这是个坏主意。您不得将 GL 实例存储到字段中,因为它很容易出错,原因如下:
- GL实例随时可能失效
- 您可以在没有 OpenGL 上下文的线程上访问它 当前
- 您可以在 OpenGL 上下文已成为当前线程的线程上访问它,但有时它不是当前的(在 OpenGL 上下文发布后) 上下文)
这就是您应该使用 GLEventListener 的原因。否则,您也可以通过调用 GLContext.getCurrentGL() but it throws a GLException if no context is current. You can use GLAutoDrawable.invoke() 获得有效的 GL 实例,它允许 运行 您的代码在正确的时间在正确的线程上运行,但 GLEventListener 更有用,因为您可以在初始化时执行一些代码.
顺便说一句,JOGL 的具体问题应该在 the official JogAmp forum 而不是这里提出。 Whosebug 是解决一般 OpenGL 问题的好地方,但大多数 JogAmp 贡献者从来没有来过这里。是的,Whosebug 不是灵丹妙药。
P.S:如果你想了解JOGL的设计选择,尤其是实例设计,我建议你阅读this article and this comment。