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 と CLCanvas は、JOGL に関する限り、その機能は本質的に同じです。唯一の違いは、GLJPanel が JComponent で軽量であるのに対し、GLCanvas はコンポーネントで重量級であることです。あなたが見ている問題は、それらの違いによるものではない可能性があります (ただし、JOGL は Java の最も安定した部分ではなく、「文書化されていない」違いがあるかもしれません)。

モデルが消えるのは、おそらく描画コードを実際に呼び出していないか、GL の初期化で何かを誤って設定したためです (非常に簡単に実行できます)。すべてを display() 関数に転送することをお勧めします。それが修正された場合は、一度に 1 つずつ元に戻します (これはパフォーマンスの問題にすぎません)。

init() でビューポート サイズを設定しているとは思いません。これは、ウィンドウ サイズが変更されるたびに行わなければならないことの 1 つです。

于 2010-03-05T22:25:40.310 に答える
3

gljpanel docから:

このコンポーネントはレンダリングに pbuffers を使用しようとしますが、pbuffers はサイズ変更できないため、サイズ変更操作中に予期しない動作が発生する可能性があることに注意してください。GLJPanel のサイズをカバーできるように pbuffer のサイズが変更されるため、GLEventListener.init(net.java.games.jogl.GLDrawable) メソッドが複数回呼び出される場合があります。サイズ変更操作中に GLJPanel のテクスチャと表示リストが失われるため、この動作は正しいです。アプリケーションは、その GLEventListener.init() メソッドをできる限り副作用のないようにする必要があります。

ええ、それは最悪です。頂点データなどを小さな JVM メモリに格納する必要があるためです。実際、なぜ同じコンテキストを再利用しないのかを調べています。

于 2010-06-08T08:57:37.800 に答える