1

OpenGLでQUADSの選択ツールを実装するために、カラーリングとオフスクリーンレンダリングを使用しています。ただし、深度テストはオフスクリーンレンダリングでは機能しないようで、特定の角度と回転では、前面のQUADが選択されます。バッファや添付ファイルをどのように設定する必要があるかについて何か考えはありますか?この問題は私の法線と関係がありますか?それとも単に深度テストですか?個人的には深度テストだと思いますが、いまいましいことはうまくいきません!!!

バッファ用のMyinit関数は次のとおりです。

public void init(final GL2 gl) {
    // setup
    gl.glGenFramebuffers(frameBufferIds.capacity(), frameBufferIds);
    gl.glGenRenderbuffers(renderBufferIds.capacity(), renderBufferIds);
    gl.glBindRenderbuffer(GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
    // 
    ViewPort viewPort = ViewPort.getCurrent(gl);
    gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_RGBA, viewPort.getWidth(), viewPort.getHeight());

    /**
     * Comment 1
     */
    //  gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, viewPort.getWidth(), viewPort.getHeight());
    
    // attach the render buffer to color attachment point
    gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBufferIds.get(0));
    gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_COLOR_ATTACHMENT0, GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
    /**
     * Comment 2
     */
    // gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_RENDERBUFFER, renderBufferIds.get(0));
    //
    if (gl.glCheckFramebufferStatus(GL.GL_FRAMEBUFFER) != GL2.GL_FRAMEBUFFER_COMPLETE) {
        System.out.println("Render Buffer problem!");
    }
}

「コメント1」と「コメント2」の部分のコメントを解除すると、レンダリングバッファの問題が発生します。しかし、「カラーアタッチメントに加えて、レンダリングバッファをGL_DEPTH_ATTACHMENTにアタッチする」必要があると聞きました。(出典:このQを見てください。どうすればそれができるのだろうか。

また、これが私の使用法コードです:

gl.glDisable(GL2.GL_DITHER);

// 1. render in offscreen
init(gl);
gl.glEnable(GL2.GL_DEPTH_TEST);
offscreenRender(gl, selectionType);

// 2. read pixel
gl.glReadBuffer(GL2.GL_DEPTH_ATTACHMENT);
gl.glReadBuffer(GL2.GL_COLOR_ATTACHMENT0);

gl.glReadPixels((int) (pos.x - pickWidth / 2), (int) (viewPort.getHeight() - pos.y - pickWidth / 2), pickWidth, pickWidth,  GL2.GL_RGBA, GL2.GL_FLOAT, pointSelectionPixels);
4

2 に答える 2

2

もちろん、深度テストは機能しません。デプスバッファを作成していません。FBOには、本質的にカラーバッファーがないのと同様に、本質的に深度バッファーがありません。両方が必要な場合は、両方を作成する必要があります

したがって、、GL_DEPTH_COMPONENT24または別の適切な深度形式GL_DEPTH_ATTACHMENTを使用してレンダーバッファを作成し、それをFBOのに添付します。

于 2013-02-03T20:18:06.447 に答える
2

私はインターネット中のフレームとレンダリングバッファについて数時間読みました。最後に、このサイトで問題を見つけました。このサイトでは、色をテクスチャにレンダリングし、深さをRenderBufferにレンダリングする必要があると述べています。それがポイントです!

そして、バッファとテクスチャを設定した後、メソッドを使用して深度と色の値を読み取るためのすべての準備が整いますglReadPixels

// reading color
glReadBuffer( GL_COLOR_ATTACHMENT0_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, color );

// reading depth
glReadBuffer( GL_DEPTH_ATTACHMENT_EXT );
glReadPixels( 0, 0, WIDTH, HEIGHT, GL_DEPTH_COMPONENT, GL_FLOAT, depth );

和野崔ありがとう!:D

于 2013-02-04T05:11:44.347 に答える