4

我切换到使用 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() 的行为,我不确定这是否也能解决它。

4

2 回答 2

3

来自gljpanel 文档

请注意,由于该组件尝试使用 pbuffers 进行渲染,并且由于 pbuffers 无法调整大小,因此在调整大小操作期间可能会出现一些令人惊讶的行为;GLEventListener.init(net.java.games.jogl.GLDrawable) 方法可能会被多次调用,因为 pbuffer 的大小被调整为能够覆盖 GLJPanel 的大小。这种行为是正确的,因为 GLJPanel 的纹理和显示列表将在调整大小操作期间丢失。应用程序应尝试使其 GLEventListener.init() 方法尽可能无副作用。

是的,很烂。因为您需要将顶点数据和其他数据存储在较小的 JVM 内存中。实际上我搜索他们为什么不重复使用相同的上下文。

于 2010-06-08T08:57:37.800 回答
3

就 JOGL 而言,GLJPanel 和 CLCanvas 在功能上基本相同。唯一的区别是 GLJPanel 是 JComponent 和轻量级,而 GLCanvas 是一个组件和重量级。您看到的任何问题很可能不是由于这些差异造成的(尽管 JOGL 不是 Java 中最稳定的部分,并且可能存在“未记录”的差异)。

消失的模型可能是由于没有实际调用绘图代码,或者在 GL 初始化中错误设置了某些内容(很容易做到)。我建议将所有内容都转移到 display() 函数。如果解决了,它一次将事情移回一个(这只是一个性能问题)。

话虽如此,我没有看到您在 init() 中设置视口大小。这是每次窗口大小改变时必须做的事情之一。

于 2010-03-05T22:25:40.310 回答