我转而使用GLCanvas中的GLJPanel来避免某些闪烁问题,但这会产生一些意想不到的后果。
从我到目前为止收集到的内容,GLJPanel每次调整大小时调用GLEventListener.init(),它会重置我在init()中启用的各种openGL函数(深度测试,照明等等),如果我幸运的是,如果我不是,那就完全抹掉我的模特。
我已经尝试过调试它,但我无法纠正这种行为。这是我的init()函数:
gl.glShadeModel( GL.GL_SMOOTH );
gl.glEnable( GL.GL_DEPTH_TEST );
gl.glDepthFunc( GL.GL_LEQUAL );
gl.glDepthRange( zNear, zFar );
gl.glDisable( GL.GL_LINE_SMOOTH );
gl.glEnable(GL.GL_NORMALIZE);
gl.glEnable( GL.GL_BLEND );
gl.glBlendFunc( GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA );
// set up the background color
gl.glClearColor( ((float)backColor.getRed () / 255.0f),
((float)backColor.getGreen() / 255.0f),
((float)backColor.getBlue () / 255.0f), 1.0f);
gl.glEnable ( GL.GL_LIGHTING );
gl.glLightfv( GL.GL_LIGHT0, GL.GL_AMBIENT, Constants.AMBIENT_LIGHT, 0 );
gl.glLightfv( GL.GL_LIGHT0, GL.GL_DIFFUSE, Constants.DIFFUSE_LIGHT, 0 );
gl.glEnable ( GL.GL_LIGHT0 );
gl.glTexEnvf( GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE );
gl.glHint( GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST );
// code to generate model
除了从init()中删除所有东西,将它添加到我的display()函数之外,还有其他方法吗?鉴于GLJPanel的init()和reshape()的行为,我不确定是否会修复它。
答案 0 :(得分:3)
就JOGL而言,GLJPanel和CLCanvas的功能基本相同。唯一的区别是GLJPanel是JComponent和轻量级,而GLCanvas是一个组件和重量级。您看到的任何问题都可能不是由于这些差异(尽管JOGL不是Java中最稳定的部分,并且可能存在'无证'差异)。
消失的模型可能是由于没有实际调用绘图代码,或者在GL初始化中设置错误(非常容易)。我建议将所有内容传输到display()函数。如果这样可以解决问题,那么它会一次一个地移动(这只是一个性能问题)。
说过我没有看到你在init()中设置视口大小。这是每次窗口大小改变时必须完成的事情之一。
答案 1 :(得分:3)
来自gljpanel doc:
请注意,由于此组件尝试使用pbuffers进行渲染,并且由于无法调整pbuffers的大小,因此在调整大小操作期间可能会出现一些令人惊讶的行为。可以多次调用GLEventListener.init(net.java.games.jogl.GLDrawable)方法,因为调整pbuffer的大小可以覆盖GLJPanel的大小。此行为是正确的,因为在调整大小操作期间GLJPanel的纹理和显示列表将丢失。应用程序应尝试使其GLEventListener.init()方法尽可能无副作用。
是的,很糟糕。因为您需要将顶点数据和其他数据存储在小型JVM内存中。 实际上我搜索他们为什么不重复使用相同的上下文。