1

JOGLを使用する単純なJavaアプリケーションがあります。eclipseから実行し、アプリケーションウィンドウを閉じると、javaw.exeは実行されたままになります。関連するコードは次のとおりです。

public class App {
    private Display mDisplay;
    private Shell mShell;
    private GL4 mGl;
    private int mProgramId;
    private int mVsId;
    private int mFsId;

    // ...

    public void start() {
        if (!initialize()) {
            return;
        }

        while (!mShell.isDisposed()) {
            if (!mDisplay.readAndDispatch()) {
                mDisplay.sleep();
            }
        }

        destroy();
    }

    private void initialize() {
        mDisplay = new Display();
        mShell = new Shell(mDisplay);

        // some SWT and opengl initialization code, which is irrelevant for this issue
        // (at least I think so)
        // getting GLProfile, GLContext, GL4 etc.

        final String vsText = ResourceManager.getShaderText(vsPath);
        final String fsText = ResourceManager.getShaderText(fsPath);

        mVsId = mGl.glCreateShader(GL4.GL_VERTEX_SHADER);
        mFsId = mGl.glCreateShader(GL4.GL_FRAGMENT_SHADER);

        mGl.glShaderSource(mVsId, 1, new String[] { vsText }, null, 0);
        mGl.glCompileShader(mVsId);

        mGl.glShaderSource(mFsId, 1, new String[] { fsText }, null, 0);
        mGl.glCompileShader(mFsId);

        mProgramId = mGl.glCreateProgram();

        mGl.glAttachShader(mProgramId, mFsId);
        mGl.glAttachShader(mProgramId, mVsId);

        // bind a constant attribute location for positions of vertices
        mGl.glBindAttribLocation(mProgramId, 0, "in_Position");
        // bind another constant attribute location, this time for color
        mGl.glBindAttribLocation(mProgramId, 1, "in_Color");
        mGl.glLinkProgram(mProgramId);

        // here error code is 0x0 (no error)
        int error = mGl.glGetError();

        mShell.open();

        return true;
    }

    private void destroy() {

        // here error code is 0x502 (GL_INVALID_OPERATION)
        int error = mGl.glGetError();

        mGl.glDetachShader(mProgramId, mFsId);
        mGl.glDetachShader(mProgramId, mVsId);

        mGl.glDeleteShader(mFsId);
        mGl.glDeleteShader(mVsId);
        mGl.glDeleteProgram(mProgramId);

        mDisplay.dispose();
    }
}

すべてのレンダリングコードと他のほとんどのopengl/JOGL関連の呼び出し(GLProfile、GLContext、GL4、およびこのサンプルにリストされているすべてのものを取得する以外)をコメントアウトしましたが、この問題は解決しません。

通常、アプリケーションは正常に動作し、シェーダーは問題なくコンパイルおよびリンクされ(このサンプルでは表示されなかった検証を使用しました)、必要なものが表示されます。唯一の問題は、アプリケーションウィンドウを閉じた後(ウィンドウの隅にあるxを押して)、javaw.exeが実行されたままになることです。

この問題は、コメントアウトしmGl.glCompileShader(mVsId);て後続の行に追加した場合にのみ削除されます。この行を離れると、javaw.exeは実行されたままになるので、問題はシェーダーの初期化/破棄コードに関連していると思います。

また、glGetError()は、initialize()の終了時に0(エラーなし)を返し、destroy()の開始時に0x502(GL_INVALID_OPERATION)を返します。テストのためにすべてのレンダリングコードをコメントアウトしたので、間にはメインループのみがあり、私が知っているopengl呼び出しはありません。

何か案は?

2012-10-03を編集:

問題が何であるかはまだわかりませんが、グラフィックカードドライバを更新したため、アプリケーションを閉じた後、「javaw.exe」が正常に終了します。私はAMDRadeonHD 6870を持っています。現在のドライバーバージョンは2012-07-27の8.982で、最後のバージョンが何であったか思い出せませんが、2011年1月頃のものだと思います。

ただし、glGetError()はdestroyの開始時に0x502を返すので、まだ何か問題があると思います。

4

2 に答える 2

1

jogamp.org の JOGL を使用すると仮定すると、pls はSWT GLCanvas またはNEWTCanvasSWTのいずれかを使用します。カスタム GLCapabilities のため、後者が優先されます。API ドキュメントを確認してください。これに加えて、SWTスレッド(リンクされたユニットテストを読む)でSWTに関連するすべてのことを行っています.IMHOは動作するはずです-少なくともユニットテスト。

更新(GPU/ドライバー)後に問題が発生しなくなったとのことでしたので、ドライバーの問題であった可能性があります。

今あなたのGLエラーに。トレース GL エラーは、システム プロパティ 'jogl.debug.DebugGL' を設定することで簡単に実行できます。つまり、コマンドライン "-Djogl.debug.DebugGL" で実行できます。これにより、GL オブジェクトのデバッグ パイプラインが自動的にインストールされ、GL エラーがチェックされます。GL エラーが発生した場合は、GLException がスローされます。

プロパティ「jogl.debug.TraceGL」を介してトレースすることもできます。

于 2012-10-07T01:15:51.070 に答える