2016-11-25 66 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解决它,并与延迟着色器共享输出纹理和渲染缓冲区,它工作得很好。 再次感谢您的回答! –