2016-11-25 112 views
1

爲了實現延遲着色,我使用fbo來執行多個渲染目標。WebGL2將深度值複製到默認渲染緩衝區錯誤

現在,這種方法的作品,但我想爲背景添加一個天空球。

顯然這個天空球體不屬於延遲渲染週期,所以我必須在第二遍渲染。

但是,爲了正確渲染天空球體,我必須檢索深度值,所以延遲渲染紋理不會阻塞球體。

要做到這一點,我複製了深度紋理給G緩衝區默認幀緩衝區:

 gl.bindFramebuffer(gl.READ_FRAMEBUFFER, gDeferredDrawer.FrameBuffer.Context); 
    gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null); 
    gl.blitFramebuffer(0, 0, gl.viewportWidth, gl.viewportHeight, 0, 0, gl.viewportWidth, gl.viewportHeight, gl.DEPTH_BUFFER_BIT, gl.NEAREST); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

這種做法沒有奏效。 WebGL的給我這個錯誤消息:

GL錯誤:GL_INVALID_OPERATION:glBlitFramebufferCHROMIUM:目的地幀緩衝區多次採樣

我真的不知道我該怎麼做是錯誤的。據我所知,互聯網上沒有明顯的例子。那麼有人請賜教嗎?

回答

2

from the spec部4.3.2

如果SAMPLE_BUFFERS用於拉伸幀緩衝區是大於零,則生成 INVALID_OPERATION錯誤。

不能使用blitFramebuffer做塊多采樣目的地。您只能從中讀取多采樣來源。

所以,如果你想使用該技術,你描述然後

  1. 使用另一個幀緩衝,結合在幀緩存然後複製到畫布上。

  2. 使畫布並不多采樣

    const gl = someCanvas.getContext("webgl2", { antialias: false }); 
    

我猜#2你的情況更好。沒有理由擁有多抽樣畫布,如果實際上所有的渲染都會受益於某些屏幕外幀緩衝區上的多重採樣。

+0

非常感謝您的反饋! 我通過使用一個額外的FBO解決它,並與延遲着色器共享輸出紋理和渲染緩衝區,它工作得很好。 再次感謝您的回答! –