为什么深度测试在屏幕外渲染中不起作用以进行颜色拾取



我正在使用着色和屏幕外渲染来实现OpenGL上的QUADS选择工具。但是深度测试似乎在屏幕外渲染中不起作用,在某些角度和旋转下,选择了前方后面的 QUAD。关于如何设置缓冲区和/或附件的任何想法?这个问题和我的法线有什么关系吗???还是只是深度测试??我个人认为这是深度测试,我只是无法让该死的东西工作!!

这是我对缓冲区的初始化函数:

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);

当然,深度测试不起作用;您没有创建深度缓冲区。FBO 本质上没有深度缓冲区,就像它们本质上没有颜色缓冲区一样。如果需要两者,则必须同时创建两者

因此,使用 GL_DEPTH_COMPONENT24 或其他适当的深度格式创建一个渲染缓冲区,并将其附加到 FBO 的GL_DEPTH_ATTACHMENT

我在互联网上阅读了几个小时关于帧和渲染缓冲区的信息。最后,我在这个网站上找到了我的问题。这个网站说我们必须将颜色渲染到纹理中,将深度渲染到渲染缓冲区中。这就是重点!

设置缓冲区和纹理后,一切都准备好使用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

相关内容

  • 没有找到相关文章

最新更新