2013-02-03 29 views
1

我使用着色和離屏渲染來實現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」附加一個渲染緩衝區。「 。(來源:Look at this 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); 

回答

2

我讀了幾個小時關於幀和渲染緩衝區遍佈互聯網。最後我在site上找到了我的問題。這個網站說我們必須渲染顏色到紋理和深度到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); 

謝謝Wano Choi! :D

2

當然的深度測試不工作;你沒有創建深度緩衝。宗教組織本質上不具有深度緩衝,就像他們本質上不具有顏色緩衝器。如果你想同時,你必須創建

因此,創建使用GL_DEPTH_COMPONENT24,或another appropriate depth format一渲染,並附上t到FBO的GL_DEPTH_ATTACHMENT

+0

謝謝你的回答! 我在「評論1」和「評論2」部分做了這個,它不起作用! –