0

JOGL を介して OpenGL 3 を使用する Java アプリケーションがあり、マルチサンプリングを実装しようとしています。私はこのチュートリアルに従っていますが、これまでのところ、1 行を除いて機能しているようです。を呼び出すとgl.glBackBuffer(GL3.GL_BACK)GL_INVALID_OPERATIONエラーが発生します。プログラムが続行すると、現在フロント バッファーであるかバック バッファーであるかに関係なく、1 つのバッファーのみに描画するように見え、再描画されるたびに目的の出力とガベージ データを切り替えます。

ドキュメントによると:

GL_INVALID_OPERATION は、デフォルトのフレームバッファが影響を受け、buf で示されるバッファが存在しない場合に生成されます。

GL_INVALID_OPERATION は、フレームバッファ オブジェクトが影響を受け、buf が GL_NONE または GL_COLOR_ATTACHMENT$m$ と等しくない場合に生成されます。ここで、$m$ は 0 から GL_MAX_COLOR_ATTACHMENTS までの値です。

これらのどちらも私の問題ではないと思いますが、そのエラーが生成される唯一のシナリオであるため、いずれかが問題になるはずです。

関連するコードは次のとおりです。

@Override
public void init(GLAutoDrawable drawable) {

    GL3 gl = drawable.getGL().getGL3();
    int[] pointer = new int[1];

    sl = new ShaderLoader();
    sl.loadShader(gl);

    gl.glEnable(GL3.GL_DOUBLEBUFFER);
    gl.glEnable(GL3.GL_MULTISAMPLE);

    gl.glClearColor(1, 1, 1, 1);

    gl.glGenTextures(1, pointer, 0);
    multisampleTex = pointer[0];

    gl.glGenBuffers(1, pointer, 0);
    multisampleFbo = pointer[0];

    gl.glGenRenderbuffers(1, pointer, 0);
    multisampleRbo = pointer[0];

    main.init(drawable);

    gl.glGetIntegerv(GL3.GL_MAX_SAMPLES, pointer, 0);
    System.out.println(pointer[0]);

}

@Override
public void dispose(GLAutoDrawable drawable) {

    GL3 gl = drawable.getGL().getGL3();

    sl.destroy(gl);

}

@Override
public void display(GLAutoDrawable drawable) {

    // GL3 gl = new DebugGL3(drawable.getGL().getGL3());
    GL3 gl = drawable.getGL().getGL3();

    // drawable.setGL(gl);

    gl.glClear(GL3.GL_COLOR_BUFFER_BIT);

    gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, multisampleFbo);

    gl.glClear(GL3.GL_COLOR_BUFFER_BIT);

    main.render(drawable);

    gl.glBindFramebuffer(GL3.GL_DRAW_FRAMEBUFFER, GL3.GL_NONE);
    gl.glBindFramebuffer(GL3.GL_READ_FRAMEBUFFER, multisampleFbo);
    checkGLError();
    gl.glDrawBuffer(GL3.GL_BACK); // Throws GL_INVALID_OPERATION
    checkGLError("OpenGL error at glDrawBuffer: 0x%h%n");
    gl.glBlitFramebuffer(0, 0, width, height, 0, 0, width, height,
            GL3.GL_COLOR_BUFFER_BIT, GL3.GL_NEAREST);

    checkGLError();

}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width,
        int height) {

    GL3 gl = drawable.getGL().getGL3();

    this.width = width;
    this.height = height;

    updateMultisampleObjects(gl);

    gl.glViewport(0, 0, width, height);

    updatePMatrix();

}

private void updateMultisampleObjects(GL3 gl) {

    gl.glBindTexture(GL3.GL_TEXTURE_2D_MULTISAMPLE, multisampleTex);
    gl.glTexImage2DMultisample(GL3.GL_TEXTURE_2D_MULTISAMPLE,
            NUM_OF_SAMPLES, GL3.GL_RGBA8, width, height, true);

    gl.glBindFramebuffer(GL3.GL_FRAMEBUFFER, multisampleFbo);
    gl.glFramebufferTexture2D(GL3.GL_FRAMEBUFFER, GL3.GL_COLOR_ATTACHMENT0,
            GL3.GL_TEXTURE_2D_MULTISAMPLE, multisampleTex, 0);

    gl.glBindRenderbuffer(GL3.GL_RENDERBUFFER, multisampleRbo);
    gl.glRenderbufferStorageMultisample(GL3.GL_RENDERBUFFER,
            NUM_OF_SAMPLES, GL3.GL_DEPTH24_STENCIL8, width, height);
    gl.glFramebufferRenderbuffer(GL3.GL_FRAMEBUFFER,
            GL3.GL_DEPTH_STENCIL_ATTACHMENT, GL3.GL_RENDERBUFFER,
            multisampleRbo);

}

また、クリーンアップをあまり行っていないことはわかっていますが、それがこの問題に影響を与えることはありません。

編集: 要求に応じて、GLCanvas が作成されるコードは次のとおりです。

    glp = GLProfile.get("GL3");
    caps = new GLCapabilities(glp);
    caps.setDoubleBuffered(true);
    canvas = new GLCanvas(caps);
    canvas.setPreferredSize(new Dimension(800, 600));
    canvas.addGLEventListener(glListener);

    frame.add(canvas);
4

1 に答える 1

0

エラーは以前の呼び出しに起因すると思われます。glBindFramebuffer()たとえば、呼び出しの直前の呼び出しから、少なくとも多数のエラーが発生するはずですglDrawBuffer()

gl.glBindFramebuffer(GL3.GL_READ_FRAMEBUFFER, multisampleFbo);
checkGLError();
gl.glDrawBuffer(GL3.GL_BACK); // Throws GL_INVALID_OPERATION
checkGLError("OpenGL error at glDrawBuffer: 0x%h%n");

multisampleFboフレームバッファ オブジェクトではありません。次のように作成されました。

gl.glGenBuffers(1, pointer, 0);
multisampleFbo = pointer[0];

glGenBuffers()フレームバッファオブジェクトではなく、バッファオブジェクトを作成します。FBO を作成するには、以下を呼び出す必要があります。glGenFramebuffers()

gl.glGenFramebuffers(1, pointer, 0);
multisampleFbo = pointer[0];
于 2014-12-27T01:50:03.077 に答える